1. 程式人生 > >Android Fragment的設計模式:工廠模式

Android Fragment的設計模式:工廠模式

一、概述:

如果專案裡有很多fragment,如果直接從各個選單直接呼叫的話是不是顯得很雜亂無章呢?
這時我們就得把相關有共性的fragment抽取出來,做成一個抽象類,封裝好所有fragment的共有的方法
如果不是共有的方法,就做成抽象方法,由其實現的fragment去實現

二、基類BaseFragment

/**
 * @描述         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入門)
——————————————————————–