天天看點

android 高仿新浪微網誌,android 仿新浪微網誌開寫篇

準備,分析:

android 高仿新浪微網誌,android 仿新浪微網誌開寫篇

分析下這個界面,主要由幾個tabbar分管不同的界面,首先我們會想到TabActivity,這是我們以前的做法,安卓更新越來越好,功能也越來越完善,我們也要時刻更新自己的技術,要不就會被淘汰,TabActivity已經被google淘汰了,現在大多數的做法已經換成了TabHost加Fragment,本文是采用FragmentTabHost類

android 高仿新浪微網誌,android 仿新浪微網誌開寫篇

FragmentTabhost實際上是又對TabHost的封裝,使我們可以更快捷的開發

FragmentTabhost的具體用法和TabHost的用法是差不多的,隻不過Activity換成了Fragment,碎片在重用上給我們開發帶來了很大的友善,不過讓人煩惱的事每次都會重新onCreateView()讓無數開發者止步于此,本人也在學習改善的過程中,目前隻用fragment寫過兩個項目,總體還是比較喜歡這個東東的,切換效果什麼的比Activity好加多了!

下面說一下這個東東遇到的問題和需要注意的問題:分辨率的适配:分辨率适配(拿來主義)

正在運作的android程式,按home鍵後退回桌面,再次點選程式圖檔又重新開機程式,解決方案:去掉首次進入程式Activity設定的啟動模式 android:launchMode="singleTask"

Log日志工具類:可從工程裡面util包下copy Logger類

本應用用的的圖檔均來自新浪微部落格戶端(如有侵權,請告之)

開始,建構

android 高仿新浪微網誌,android 仿新浪微網誌開寫篇

本應采用的是比較普遍的一種分包方式,主要按照元件的類型來分:建構配置類,基類,應用類(application)

建構工具類(其實就是把總結的工具類CV一下)

看到這些,肯定會有很多人會想:都用别人的安全不,好用不(如果有好用的可以分享下)----曾經自己也寫過,http的一些操作類啊什麼的,但總不如人家封裝的完善,既然不如開源的好,那就直接套用的,不适應的地方自己在做下修改,何樂而不為呢?也有很多ui綁定點選事件的開源類庫,在本應用中沒有到...

//=========所有Activity繼承該類,用于實作一些基本操作

public class BaseActivity extends FragmentActivity {

public MyHandler myHandler;

protected ProgressDialog progressDialog;

@Override

protected void onCreate(Bundle arg0) {

// TODO Auto-generated method stub

super.onCreate(arg0);

init();

}

private void init() {

myHandler = new MyHandler(this);

progressDialog = new ProgressDialog(this);

progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);

progressDialog.setCancelable(true);

progressDialog.setMessage("正在加載");

progressDialog.setCanceledOnTouchOutside(false);

}

public static class MyHandler extends Handler {

WeakReference baseActivitys;

MyHandler(BaseActivity baseActivity) {

baseActivitys = new WeakReference(baseActivity);

}

@Override

public void handleMessage(Message msg) {// 定義一個Handler,用于處理下載下傳線程與UI間通訊

if (!Thread.currentThread().isInterrupted()) {

final BaseActivity baseActivity = baseActivitys.get();

switch (msg.what) {

case AppConfig.SHWO_PROGRESS:

baseActivity.progressDialog.show();// 顯示進度對話框

break;

case AppConfig.HIDE_PROGRESS:

baseActivity.progressDialog.hide();// 隐藏進度對話框,不可使用dismiss()、cancel(),否則再次調用show()時,顯示的對話框小圓圈不會動。(WebView)

break;

case AppConfig.DISS_PROGRESS:

baseActivity.progressDialog.dismiss();//關閉進度對話框

case AppConfig.NET_ERR_SHOW:

baseActivity.ToastShow(AppConfig.NET_ERR);// 網絡異常

break;

case AppConfig.DATA_ERR_SHOW:

baseActivity.ToastShow(AppConfig.DATA_ERR);// 資料異常

break;

default:

baseActivity.getMessage(msg);

break;

}

}

super.handleMessage(msg);

}

};

public void showProgress(){

myHandler.sendEmptyMessage(AppConfig.SHWO_PROGRESS);

}

public void hideProgress(){

myHandler.sendEmptyMessage(AppConfig.HIDE_PROGRESS);

}

public void dissProgress(){

myHandler.sendEmptyMessage(AppConfig.DISS_PROGRESS);

}

public void netErrShow() {

myHandler.sendEmptyMessage(AppConfig.NET_ERR_SHOW);

}

public void dataErrShow() {

myHandler.sendEmptyMessage(AppConfig.DATA_ERR_SHOW);

}

public void sendMessage(int what){

myHandler.sendEmptyMessage(what);

}

public void sendMessage(Message msg){

myHandler.sendMessage(msg);

}

public void sendMessage(Message msg,long delayMillis){

myHandler.sendMessageDelayed(msg, delayMillis);

}

public void ToastShow(String content) {

ToastUtils.show(BaseActivity.this.getApplicationContext(), content);

}

protected void getMessage(Message msg) {

}

}

//===============主界面

public class KKsinaActivity extends BaseActivity{

private FragmentTabHost mFth;

private LinkedList> classes;

private LayoutInflater layoutInflater;//布局加載管理器

private int mImageView[] = {R.drawable.tab_home,R.drawable.tab_message,R.drawable.tab_profile,R.drawable.tab_discover,R.drawable.tab_more};//Tab頁籤圖示

private String mTextview[] = {"首頁", "消息", "我","廣場", "更多"};//Tab頁籤标題

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_kksina);

initData();

initView();

}

private void initData() {

// TODO Auto-generated method stub

classes = new LinkedList>();

classes.add(HomeFragment.class);

classes.add(MessageFragment.class);

classes.add(ProfileFragment.class);

classes.add(DiscoverFragment.class);

classes.add(MoreFragment.class);

}

private void initView() {

// TODO Auto-generated method stub

layoutInflater = LayoutInflater.from(this);

//執行個體化TabHost對象,得到TabHost

mFth = (FragmentTabHost)findViewById(android.R.id.tabhost);

mFth.setup(this, getSupportFragmentManager(), R.id.realtabcontent);

addTab(classes);

}

private void addTab(final LinkedList> classes) {

int size = classes.size();

for (int i = 0; i < size; i++) {

//為每個Tab按鈕設定圖示、文字和内容

TabSpec tabSpec = mFth.newTabSpec(mTextview[i]).setIndicator(getTabItemView(i));

//将Tab按鈕添加進Tab頁籤中

mFth.addTab(tabSpec, classes.get(i), null);

mFth.getTabWidget().getChildAt(i).setBackgroundResource(R.drawable.tabbar_bg);

}

}

private View getTabItemView(int index){

View view = layoutInflater.inflate(R.layout.tab_item_view, null);

ImageView p_w_picpathView = (ImageView) view.findViewById(R.id.iv_tabbar);

p_w_picpathView.setImageResource(mImageView[index]);

TextView textView = (TextView) view.findViewById(R.id.tv_tabbar);

textView.setText(mTextview[index]);

return view;

}

}

//================AdapterBase

public abstract class AdapterBase extends BaseAdapter {

protected List mList = new LinkedList();

public List getList(){

return mList;

}

public void appendToList(List list) {

if (list == null) {

return;

}

mList.addAll(list);

notifyDataSetChanged();

}

public void appendToTopList(List list) {

if (list == null) {

return;

}

mList.addAll(0, list);

notifyDataSetChanged();

}

public void setList(List list) {

if (list == null) {

return;

}

mList=list;

notifyDataSetChanged();

}

public void clear() {

mList.clear();

notifyDataSetChanged();

}

@Override

public int getCount() {

// TODO Auto-generated method stub

return mList.size();

}

@Override

public T getItem(int position) {

// TODO Auto-generated method stub

if(position > mList.size()-1){

return null;

}

return mList.get(position);

}

@Override

public long getItemId(int position) {

// TODO Auto-generated method stub

return position;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

// TODO Auto-generated method stub

if (position == getCount() - 1) {

onReachBottom();

}

return getExView(position, convertView, parent);

}

protected abstract View getExView(int position, View convertView, ViewGroup parent);

protected abstract void onReachBottom();

}

結束,分享