Android中Fragment相互切換間不被回收的實現(xiàn)方法
前言
Android運行在各種各樣的設(shè)備中,有小屏幕的手機(jī),超大屏的平板甚至電視。針對屏幕尺寸的差距,很多情況下,都是先針對手機(jī)開發(fā)一套App,然后拷貝一份,修改布局以適應(yīng)平板神馬超級大屏的。難道無法做到一個App可以同時適應(yīng)手機(jī)和平板么,當(dāng)然了,必須有啊。Fragment的出現(xiàn)就是為了解決這樣的問題。
如今市面上的應(yīng)用基本上都是單Activity+多Fragment實現(xiàn)的了,而這類APP都有在相互切換時不被回收,即切換回原來的Fragment時還是原先的狀態(tài),這就是這里要實現(xiàn)的了。
這里使用Fragment的add()
、show()
、hide()
實現(xiàn),即顯示和隱藏,這樣原來的Fragment就不會被銷毀了。
二話不說,貼代碼,代碼是最好的老師。
示例代碼(注釋還算詳細(xì)了)
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private ImageView ibOne; private ImageView ibTwo; private ImageView ibThree; private FragmentManager mFm; private ArrayList<Fragment> mFragmentList = new ArrayList<Fragment>(); private String[] mFragmentTagList = {"OneFragment", "TwoFragment", "ThreeFragment"}; private Fragment mCurrentFragmen = null; // 記錄當(dāng)前顯示的Fragment @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initData(); } private void initData() { OneFragment oneFragment = new OneFragment(); TwoFragment twoFragment = new TwoFragment(); ThreeFragment threeFragment = new ThreeFragment(); mFragmentList.add(0, oneFragment); mFragmentList.add(1, twoFragment); mFragmentList.add(2, threeFragment); mCurrentFragmen = mFragmentList.get(0); // 初始化首次進(jìn)入時的Fragment mFm = getFragmentManager(); FragmentTransaction transaction = mFm.beginTransaction(); transaction.add(R.id.fl_show, mCurrentFragmen, mFragmentTagList[0]); transaction.commitAllowingStateLoss(); } // findViewById private void initView() { ibOne = (ImageView)findViewById(R.id.ib_one); ibTwo = (ImageView)findViewById(R.id.ib_two); ibThree = (ImageView)findViewById(R.id.ib_three); ibOne.setOnClickListener(this); ibTwo.setOnClickListener(this); ibThree.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.ib_one: switchFragment(mFragmentList.get(0), mFragmentTagList[0]); break; case R.id.ib_two: switchFragment(mFragmentList.get(1), mFragmentTagList[1]); break; case R.id.ib_three: switchFragment(mFragmentList.get(2), mFragmentTagList[2]); break; } } // 轉(zhuǎn)換Fragment void switchFragment(Fragment to, String tag){ if(mCurrentFragmen != to){ FragmentTransaction transaction = mFm.beginTransaction(); if(!to.isAdded()){ // 沒有添加過: // 隱藏當(dāng)前的,添加新的,顯示新的 transaction.hide(mCurrentFragmen).add(R.id.fl_show, to, tag).show(to); }else{ // 隱藏當(dāng)前的,顯示新的 transaction.hide(mCurrentFragmen).show(to); } mCurrentFragmen = to; transaction.commitAllowingStateLoss(); } } // 當(dāng)activity非正常銷毀時被調(diào)用 @Override public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) { super.onSaveInstanceState(outState, outPersistentState); // 重置Fragment,防止當(dāng)內(nèi)存不足時導(dǎo)致Fragment重疊 updateFragment(outState); } // 重置Fragment private void updateFragment(Bundle outState) { mFm = getFragmentManager(); if(outState == null){ FragmentTransaction transaction = mFm.beginTransaction(); OneFragment oneFragment = new OneFragment(); mCurrentFragmen = oneFragment; transaction.add(R.id.fl_show, oneFragment, mFragmentTagList[0]).commitAllowingStateLoss(); }else{ // 通過tag找到fragment并重置 OneFragment oneFragment = (OneFragment) mFm.findFragmentByTag(mFragmentTagList[0]); TwoFragment twoFragment = (TwoFragment) mFm.findFragmentByTag(mFragmentTagList[1]); ThreeFragment threeFragment = (ThreeFragment) mFm.findFragmentByTag(mFragmentTagList[2]); mFm.beginTransaction().show(oneFragment).hide(twoFragment).hide(threeFragment); } } }
我以前對于這種需求是在一個Activity中使用RelativeLayout,在其中加入多個布局(類似Fragment),當(dāng)點擊下方Tab時設(shè)置布局的visibility的,思想是一樣的,但這樣實現(xiàn)起來很是丑陋,所以不建議使用。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持
- Android基礎(chǔ)之使用Fragment控制切換多個頁面
- Android App中使用ViewPager+Fragment實現(xiàn)滑動切換效果
- Android使用Fragment打造萬能頁面切換框架
- Android Fragment中使用SurfaceView切換時閃一下黑屏的解決辦法
- 一個Activity中多個Fragment的切換
- Android fragment實現(xiàn)多個頁面切換效果
- Android中使用TabHost 與 Fragment 制作頁面切換效果
- Android使用TabLayou+fragment+viewpager實現(xiàn)滑動切換頁面效果
- Android開發(fā)使用Activity嵌套多個Fragment實現(xiàn)橫豎屏切換功能的方法
- fragment實現(xiàn)隱藏及界面切換效果
相關(guān)文章
解決android studio引用遠(yuǎn)程倉庫下載慢(JCenter下載慢)
這篇文章主要介紹了解決android studio引用遠(yuǎn)程倉庫下載慢(JCenter下載慢),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Android PopupWindow實現(xiàn)右側(cè)、左側(cè)和底部彈出菜單
這篇文章主要為大家詳細(xì)介紹了Android PopupWindow實現(xiàn)右側(cè)、左側(cè)和底部彈出菜單的相關(guān)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11Android編程基于自定義view實現(xiàn)公章效果示例【附源碼下載】
這篇文章主要介紹了Android編程基于自定義view實現(xiàn)公章效果,結(jié)合實例形式分析了Android使用自定義view進(jìn)行圖形繪制的相關(guān)操作技巧,并附帶完整實例源碼供讀者下載參考,需要的朋友可以參考下2017-11-11Android開發(fā)筆記之: 數(shù)據(jù)存儲方式詳解
本篇文章是對Android中數(shù)據(jù)存儲方式進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Android自定義可拖拽的懸浮按鈕DragFloatingActionButton
這篇文章主要介紹了Android自定義可拖拽的懸浮按鈕DragFloatingActionButton,需要的朋友可以參考下2017-06-06