1. 程式人生 > >【安卓】採用靜態工廠方法的Fragment實現ViewPager+Fragment

【安卓】採用靜態工廠方法的Fragment實現ViewPager+Fragment

優化點1 .用一個transaction 的replace函式,這樣每次切換都會把上一次的fragment回收了,就不存在記憶體問題

  實現方案有

第一種:用一個Fragment類的例項  維護當前正在顯示的Fragment,每次切換都適合把正在顯示對Fragment賦值,然後在點選的時候就可以使用關鍵字 “instance of”判斷mCurrent屬於哪一個Fragment,然後呼叫相應的方法。
第二種:寫一個抽象的類繼承Fragment,包括一個處理點選事件的抽象想法,所有Fragment繼承這個父類並實現抽象方法,然後再 使用的時候用一個Fragment類的例項 維護當前正在顯示的Fragment,每次切換都適合把正在顯示對Fragment賦值給mCurrent,然後在點選的時候直接呼叫mCurrent的處理點選事件的方法就行了。

現在我採用第二種:

優化點2 :點選時需要例項化Fragment, 那麼每個Fragment 可以這樣子優化,採用靜態工廠方法實現Fragement 的例項化

優化點 3 第二種方法中通過 Fragment 傳值來判斷當前的物件是否是之前的那一個,那麼或許咱們可以通過傳遞String 物件來判斷即可

實現的思路為

/**  仿 眾籌app**/
@Bind(R.id.linelayout_main)LinearLayout linelayout_main;
@Bind(R.id.linelayout_active)LinearLayout linelayout_active;
@Bind(R.id.linelayout_message
)LinearLayout linelayout_message; @Bind(R.id.linelayout_mine)LinearLayout linelayout_mine; private MainPageFragment mMainFragment; private DynamicFragment mDynamicFragment; private MessageFragment mMessageFragment; private MineFragment mMineFragment; private FrameLayout mframelayout; private String mTempFragmentTAG
="";//標誌當前的欄目
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
mframelayout=(FrameLayout)findViewById(R.id.fragment_content);


private void SwitchFragment(Fragment mfragment,String currentTAG){
    if(!currentTAG.equals(mTempFragmentTAG)){//當點選的fragment 不是當前點選的則新建,是則跳過
FragmentManager mfragmentmanager = getSupportFragmentManager();
FragmentTransaction mfragmentTransaction = mfragmentmanager.beginTransaction();
        if(!mfragment.isAdded()){
            //mfragmentTransaction.addToBackStack(null); BackStack 棧
mfragmentTransaction.replace(R.id.fragment_content, mfragment,currentTAG).commit();
}else{
            mfragmentTransaction.show(mfragment);
}
        mTempFragmentTAG=currentTAG;
}
}
private void setSelect(int i) {
    if(i==0){//選單中的首頁欄目
mMainFragment= MainPageFragment.newInstance();
SwitchFragment(mMainFragment,"MAIN");
}else if(i==1){//選單中的關注欄目
mDynamicFragment=DynamicFragment.newInstance();
SwitchFragment(mDynamicFragment,"DYNAMIC");
}else if(i==3){//選單中的訊息欄目
mMessageFragment=MessageFragment.newInstance();
SwitchFragment(mMessageFragment,"MESSAGE");
}else{//選單中的我的欄目
mMineFragment=MineFragment.newInstance();
SwitchFragment(mMineFragment,"MINE");
}

}
/**
 * 靜態工廠方法
* @return
*/
public class MainPageFragment extends Fragment {
      private static MainPageFragment mMainPageFragment=null;
public static MainPageFragment newInstance() {
   mMainPageFragment=new MainPageFragment();
return mMainPageFragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
   //todoSomething
   }
}