Android Fragment的设计模式:工厂模式

一、概述:

如果项目里有很多fragment,如果直接从各个菜单直接调用的话是不是显得很杂乱无章呢?
这时我们就得把相关有共性的fragment抽取出来,做成一个抽象类,封装好所有fragment的共有的方法
如果不是共有的方法,就做成抽象方法,由其实现的fragment去实现

二、基类BaseFragment

关于LoadingPage 页面的实现这里就不多说了,请看
http://blog.csdn.net/lovoo/article/details/51714407

/** * @描述 fragment * @项目名称 App_Shop * @包名 com.android.shop.fragment * @类名 BaseFragment * @author chenlin * @date 2014年3月28日 下午10:33:59 */

public abstract  class BaseFragment<T> extends Fragment {

    private LoadingPage mLoadingPage;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (mLoadingPage == null) {
            mLoadingPage = new LoadingPage(getActivity()){
                @Override
                public View createSuccessView() {
                    return BaseFragment.this.createSuccessView();
                }

                @Override
                public LoadResult loadFromServer() {
                    return BaseFragment.this.load();
                }
            };
        }else {
            ViewUtil.removeParent(mLoadingPage);
        }
        return mLoadingPage;
    }



    /*** * 创建成功的界面 * @return */
    public  abstract View createSuccessView();

    /** * 从服务器得到结果吗 * @return */
    protected abstract LoadResult load();

    /** * 显示加载页面 */
    public void show(){
        if (mLoadingPage != null) {
            mLoadingPage.show();
        }
    }

    /**校验数据 */
    public LoadResult checkData(List<T> datas){
        if (datas == null) {
            return LoadResult.error;
        }else {
            if (datas.size() == 0) {
                return LoadResult.empty;
            }else {
                return LoadResult.success;
            }
        }
    }
}

三、工厂类FragmentFactory
这里使用了SparseArray类来存取所有的fragment,在调用的时候根据frament所在的位置来读取

/** * @描述 fragment工厂 * @项目名称 App_Shop * @包名 com.android.shop.helper * @类名 FragmentFactory * @author chenlin * @date 2014年3月27日 下午9:04:13 */
@SuppressWarnings("all")
public class FragmentFactory {
    private static SparseArray<BaseFragment> mFragments = new SparseArray<BaseFragment>();
    public static BaseFragment createFragment(int position){
        BaseFragment fragment = mFragments.get(position);
        if (fragment == null) {
            switch (position) {
            case 0:
            //主页
                fragment = new HomeFragment();
                break;
            case 1:
            //App商城
                fragment = new AppFragment();
                break;
            case 2:
                fragment = new GameFragment();
                break;
                //主题
            case 3:
                fragment = new SubjectFragment();
                break;
            case 4:
            //种类
                fragment = new CategoryFragment();
                break;
            case 5:
            //
                fragment = new TopFragment();
                break;
            }

            if (fragment != null) {
                mFragments.put(position, fragment);
            }
        }

        return fragment;
    }

}

四、工厂类的使用

1)在string.xml里定义

<string-array name="tab_names">
        <item>首页</item>
        <item>应用</item>
        <item>游戏</item>
        <item>专题</item>
        <item>分类</item>
        <item>排行</item>
    </string-array>

2)创建activity

public class MainActivity extends BaseActivity {   
    private ViewPager mViewPager;
    private PagerTabStrip mTabStrip;
    private String[] mTabNames;
    private Fragment mCurrentFragment;
    private FrameLayout mMenuFragment;

    @Override
    public void init() {        
        setContentView(R.layout.activity_main);
        mTabNames = Util.getStringArray(R.array.tab_names);
    }

    @Override
    public void initViews() {
        mViewPager = (ViewPager) findViewById(R.id.vp_main);
        mViewPager.setAdapter(new TabPagerAdapter(getSupportFragmentManager()));

        mTabStrip = (PagerTabStrip) findViewById(R.id.pager_tab_strip);
        mTabStrip.setTabIndicatorColor(getResources().getColor(R.color.tabIndicator_color));
    }

    @Override
    protected void initEvents() {
        mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){
            @Override
            public void onPageSelected(int position) {
                //getSupportActionBar().setSelectedNavigationItem(position);
                //在页面切换时显示不同的加载页面
                FragmentFactory.createFragment(position).show();
                super.onPageSelected(position);
            }
        });
    }

    private class TabPagerAdapter extends FragmentStatePagerAdapter{

        public TabPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            mCurrentFragment = FragmentFactory.createFragment(position);
            return mCurrentFragment;
        }

        @Override
        public int getCount() {
            return mTabNames.length;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mTabNames[position];
        }       
    }

3、布局

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawerlayout_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <android.support.v4.view.ViewPager
        android:id="@+id/vp_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true" >

        <android.support.v4.view.PagerTabStrip
            android:id="@+id/pager_tab_strip"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="top"
            android:background="#d17026"
            android:textColor="#fff" />
    </android.support.v4.view.ViewPager>

    <FrameLayout
        android:id="@+id/fl_menu"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="start"
        android:text="应用详情" >
    </FrameLayout>

</android.support.v4.widget.DrawerLayout>

———————————————————————
有需求者请加qq:136137465,非诚勿扰
(java 架构师全套教程,共760G, 让你从零到架构师,每月轻松拿3万)
01.高级架构师四十二个阶段高
02.Java高级系统培训架构课程148课时
03.Java高级互联网架构师课程
04.Java互联网架构Netty、Nio、Mina等-视频教程
05.Java高级架构设计2016整理-视频教程
06.架构师基础、高级片
07.Java架构师必修linux运维系列课程
08.Java高级系统培训架构课程116课时
(送:hadoop系列教程,java设计模式与数据结构, Spring Cloud微服务, SpringBoot入门)
——————————————————————–

    原文作者:LovooGod
    原文地址: https://blog.csdn.net/lovoo/article/details/51714613
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞