准备,分析:
分析下这个界面,主要由几个tabbar分管不同的界面,首先我们会想到TabActivity,这是我们以前的做法,安卓更新越来越好,功能也越来越完善,我们也要时刻更新自己的技术,要不就会被淘汰,TabActivity已经被google淘汰了,现在大多数的做法已经换成了TabHost加Fragment,本文是采用FragmentTabHost类
具体可参考http://developer.android.com/reference/android/support/v13/app/FragmentTabHost.html
http://blog.csdn.net/yangyu20121224/article/details/9016223
FragmentTabhost实际上是又对TabHost的封装,使我们可以更快捷的开发
FragmentTabhost的具体用法和TabHost的用法是差不多的,只不过Activity换成了Fragment,碎片在重用上给我们开发带来了很大的方便,不过让人烦恼的事每次都会重新onCreateView()让无数开发者止步于此,本人也在学习改善的过程中,目前只用fragment写过两个项目,总体还是比较喜欢这个东东的,切换效果什么的比Activity好加多了!
下面说一下这个东东遇到的问题和需要注意的问题:
分辨率的适配:分辨率适配(拿来主义)
正在运行的android程序,按home键后退回桌面,再次点击程序图片又重启程序,解决方案:去掉首次进入程序Activity设置的启动模式 android:launchMode="singleTask" 需要了解知识点android的启动模式 http://www.cnblogs.com/fanchangfa/archive/2012/08/25/2657012.html 网上有整理很多,本人文笔不太好,就不多加解释了
Log日志工具类:可从工程里面util包下copy Logger类
本应用用的的图片均来自新浪微博客户端(如有侵权,请告之)
开始,构建
本应采用的是比较普遍的一种分包方式,主要按照组件的类型来分:
构建配置类,基类,应用类(application)
构建工具类(其实就是把总结的工具类CV一下)
连网部分采用比较常见的框架:android-async-http
图片的加载也是android中非常重要的处理:Android-Universal-Image-Loader
上下拉刷新:Android-PullToRefresh
看到这些,肯定会有很多人会想:都用别人的安全不,好用不(如果有好用的可以分享下)----曾经自己也写过,http的一些操作类啊什么的,但总不如人家封装的完善,既然不如开源的好,那就直接套用的,不适应的地方自己在做下修改,何乐而不为呢?也有很多ui绑定点击事件的开源类库,在本应用中没有到...
//=========所有Activity继承该类,用于实现一些基本操作
/** * 应用基类 * * @author Johnny * */ 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<BaseActivity> baseActivitys; MyHandler(BaseActivity baseActivity) { baseActivitys = new WeakReference<BaseActivity>(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); } /** * 接受消息 实现类重写该方法接收消息 * @param msg */ protected void getMessage(Message msg) { } }
//===============主界面
/** * 主界面 * @author Johnny * */ public class KKsinaActivity extends BaseActivity{ private FragmentTabHost mFth; private LinkedList<Class<?>> 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<Class<?>>(); 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<Class<?>> 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); } } /** * 给Tab按钮设置图标和标题 */ private View getTabItemView(int index){ View view = layoutInflater.inflate(R.layout.tab_item_view, null); ImageView imageView = (ImageView) view.findViewById(R.id.iv_tabbar); imageView.setImageResource(mImageView[index]); TextView textView = (TextView) view.findViewById(R.id.tv_tabbar); textView.setText(mTextview[index]); return view; } }
//================AdapterBase
/** * 基本Adapter * @author Johnny * * @param <T> */ public abstract class AdapterBase<T> extends BaseAdapter { protected List<T> mList = new LinkedList<T>(); public List<T> getList(){ return mList; } public void appendToList(List<T> list) { if (list == null) { return; } mList.addAll(list); notifyDataSetChanged(); } public void appendToTopList(List<T> list) { if (list == null) { return; } mList.addAll(0, list); notifyDataSetChanged(); } public void setList(List<T> 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(); }
结束,分享
KKsina