谷歌电子市场开发记录(2)-框架搭建

来源:互联网 发布:淘宝二手笔记本怎么样 编辑:程序博客网 时间:2024/06/08 00:43
上一篇博客说了开发前的准备工作,现在就要开始正式开发了。
在项目开发时,难免需要使用到常用的一些对象,比如说Context上下文,经常需要使用,因此,此处,可以新建一个全局的Application,将常用的一些对象先new好,以便以后直接调用。
1.新建一个GlobalApplication类,继承Application,实现OnCreate()方法,在这个类中,需要初始化三个对象。
(1)Context mContext=getApplicationContext();上下文经常需要使用使用,因此,在此处先得到。
(2)Handler mHandler=new Handler();Handler对象在处理多线程,消息队列时需要经常使用,此项目需要处理多线程下载,Handler更显得至关重要。
(3)int MainThreadId=android.os.Process.myTid();获得主线程Id,因为要处理多线程,而处理UI时,必须在主线程处理,因此,需要得到主线程Id,从而判断某个处理是否运行在主线程
在初始化之后,提取作为全局成员,并得到get()方法。
2.为了处理UI中的一些逻辑,将一些必用的方法封装为一个工具类。新建一个工具类UIUtils,在这个类中,封装很多方法。
(1)根据id得到字符串,字符串数组,颜色值,颜色选择器,图片,尺寸值等。
(2)dp转px,px转dp
         public static int dp2px(int dp){
                float density=getContext().getResourse().getDisplayMetrix().density;//获取屏幕分辨率
                return (int)(dp*density+0.5f);
         }
         public static float px2dp(float px){
                float density=getContext().getResourse().getDisplayMetrix().density;//获取屏幕分辨率
                return px/density;
         }
(3)判断是否位于主线程
         public static boolean IsRunningMainThread(){
                 return getMainThreadId()==android.os.Process.myTid();
         }
(4)将线程抛到主线程中运行
         public static void RunningMainThread(Runnable r){
                 if(isRunningMainThread()){
                   r.run();
                  }else{
                              getHandler().post(r);
                          }
          }
(5)加载布局
3.接下来就是对于该项目整体框架的分析
上图就是对于界面的整体分析,可以看到,界面大体框架就是如此,现在可以分析:
(1)对于ActionBar,因为此处标题栏是使用android自带的标题栏,我们在之前已经导入v7-appcompat包,可以很好的兼容,同时,我们创建一个BaseActivity继承ActionBarActivity,作为此项目中所有活动的基类,也就是所创建的所有活动都要继承BaseActivity,为了美观,可以在AndroidManifest配置文件中的application设置主题为Theme.AppCompat.Light。这样ActionBar就设置完成。
(2)对于PagerTab(指示器),我们可以自己写一个自定义控件,创建一个PagerTab类继承ViewGroup,在其中设置相应属性,其中需要些两个状态选择器,一个是每一个标签的背景按下与抬起是不一样的,还有就是其中标签文字,选中、按下状态和未选中是不一样的。在自定义控件写好之后,剩下的就是对其的调用。
(3)最麻烦的就是ViewPager的设置,我们知道,ViewPager中装的是一个个页面,也就是一个个View,怎样将一个个View放入ViewPager中,是一个问题。
    我们换个角度来思考,每一个ViewPager都需要一个Adapter适配器,而viewpager的适配器有三类可以继承,PagerAdapter,Adapter,FragmentPagerAdapter,一般我们都使用PagerAdapter,在其中实现四个未实现的方法(getCount(),instantiateItem(),isViewFromObject(),destroyItem()),这个方法确实可以,但是总感觉用起来非常麻烦,Adapter是父类,一般我们都会使用它的子类来继承,那么,我们考虑一下FragmentPagerAdapter是否可以,我们知道FragmentPagerAdapter是PagerAdapter中的其中一种实现。它将每一个页面表示为一个 Fragment,并且每一个Fragment都将会保存到fragment manager当中。而且,当用户没可能再次回到页面的时候,fragment manager才会将这个Fragment销毁。

这种pager十分适用于有一些静态fragment,例如一组tabs,的时候使用。每个页面对应的Fragment当用户可以访问的时候会一直存在内存中,但是,当这个页面不可见的时候,view hierarchy将会被销毁。这样子会导致应用程序占有太多资源。当页面数量比较大的时候,建议使用 FragmentStatePagerAdapter

当使用FragmentPagerAdapter的时候,ViewPager一定要使用正确的ID set

FragmentPagerAdapter的子类只要实现 getItem(int)  getCount()方法。

由此我们可以认定,在此种情况下,选用FragmentPagerAdapter是最好,那么问题就来了,在getItem()方法中需要返回一个Fragment对象,而此处又有多个页面,需要多个Fragment,该返回哪个fragment呢?

这里有几个解决办法,第一种就是使用HashMap将每个初始化后的Fragment对象存储起来,然后再通过hashmap.get(pos)得到相应的Fragment;第二种就是使用工厂设计模式,生产出一个一个的Fragment。现在考虑这两种方法的优劣:

第一种方法需要在开始时就要初始化所有的Fragment,但是我们想要的却是当ViewPager滑到哪一个页面,哪一个Fragment才被初始化,这样会大大节省内存,而第二种方法就解决了这个问题。

我们可以创建一个BaseFragment作为每一个页面的基类,因为这几个页面有相似之处,可以在基类就显示出(相似之处在后面会提到),在工厂类中可以根据ViewPager的位置来选择初始化何种界面。

public class FragmentFactroy {    private static HashMap<Integer,BaseFragment> hashMapfragment=new HashMap<Integer,BaseFragment>();    public static BaseFragment createFragment(int pos){        BaseFragment baseFragment=hashMapfragment.get(pos);        if (baseFragment==null){            switch (pos){                case 0:                    baseFragment=new HomeFragment();                    break;                case 1:                    baseFragment=new AppFragment();                    break;                case 2:                    baseFragment=new GameFragment();                    break;                case 3:                    baseFragment=new SubjectFragment();                    break;                case 4:                    baseFragment=new RecommendFragment();                    break;                case 5:                    baseFragment=new CategoryFragment();                    break;                case 6:                    baseFragment=new HotFragment();                    break;                default:                    break;            }        }        hashMapfragment.put(pos,baseFragment);        return baseFragment;    }
}

工厂类创建完成之后,在ViewPager适配器的getItem()方法中直接调用,BaseFragment fragment=FragmentFactroy.createFragment(pos);然后返回fragment就可以了。至此ViewPager的填充问题就解决了。
由此,我们可以看出,此项目的大体框架就是使用Fragment填充ViewPager,在MainActivity中的布局文件中直接使用PagerTab和ViewPager来填充布局。


原创粉丝点击