Android Fragment的設計模式:工廠模式
阿新 • • 發佈:2019-01-10
一、概述:
如果專案裡有很多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入門)
——————————————————————–