【安卓】採用靜態工廠方法的Fragment實現ViewPager+Fragment
阿新 • • 發佈:2019-02-01
優化點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
}}