Android中Fragment相互切換間不被回收的實(shí)現(xiàn)方法
前言
Android運(yùn)行在各種各樣的設(shè)備中,有小屏幕的手機(jī),超大屏的平板甚至電視。針對(duì)屏幕尺寸的差距,很多情況下,都是先針對(duì)手機(jī)開(kāi)發(fā)一套App,然后拷貝一份,修改布局以適應(yīng)平板神馬超級(jí)大屏的。難道無(wú)法做到一個(gè)App可以同時(shí)適應(yīng)手機(jī)和平板么,當(dāng)然了,必須有啊。Fragment的出現(xiàn)就是為了解決這樣的問(wèn)題。
如今市面上的應(yīng)用基本上都是單Activity+多Fragment實(shí)現(xiàn)的了,而這類APP都有在相互切換時(shí)不被回收,即切換回原來(lái)的Fragment時(shí)還是原先的狀態(tài),這就是這里要實(shí)現(xiàn)的了。
這里使用Fragment的add()
、show()
、hide()
實(shí)現(xiàn),即顯示和隱藏,這樣原來(lái)的Fragment就不會(huì)被銷毀了。
二話不說(shuō),貼代碼,代碼是最好的老師。
示例代碼(注釋還算詳細(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)入時(shí)的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()){ // 沒(méi)有添加過(guò): // 隱藏當(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非正常銷毀時(shí)被調(diào)用 @Override public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) { super.onSaveInstanceState(outState, outPersistentState); // 重置Fragment,防止當(dāng)內(nèi)存不足時(shí)導(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{ // 通過(guò)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); } } }
我以前對(duì)于這種需求是在一個(gè)Activity中使用RelativeLayout,在其中加入多個(gè)布局(類似Fragment),當(dāng)點(diǎn)擊下方Tab時(shí)設(shè)置布局的visibility的,思想是一樣的,但這樣實(shí)現(xiàn)起來(lái)很是丑陋,所以不建議使用。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持
- Android基礎(chǔ)之使用Fragment控制切換多個(gè)頁(yè)面
- Android App中使用ViewPager+Fragment實(shí)現(xiàn)滑動(dòng)切換效果
- Android使用Fragment打造萬(wàn)能頁(yè)面切換框架
- Android Fragment中使用SurfaceView切換時(shí)閃一下黑屏的解決辦法
- 一個(gè)Activity中多個(gè)Fragment的切換
- Android fragment實(shí)現(xiàn)多個(gè)頁(yè)面切換效果
- Android中使用TabHost 與 Fragment 制作頁(yè)面切換效果
- Android使用TabLayou+fragment+viewpager實(shí)現(xiàn)滑動(dòng)切換頁(yè)面效果
- Android開(kāi)發(fā)使用Activity嵌套多個(gè)Fragment實(shí)現(xiàn)橫豎屏切換功能的方法
- fragment實(shí)現(xiàn)隱藏及界面切換效果
相關(guān)文章
解決android studio引用遠(yuǎn)程倉(cāng)庫(kù)下載慢(JCenter下載慢)
這篇文章主要介紹了解決android studio引用遠(yuǎn)程倉(cāng)庫(kù)下載慢(JCenter下載慢),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Android實(shí)現(xiàn)購(gòu)物車添加商品特效
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)購(gòu)物車添加商品特效,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06Android PopupWindow實(shí)現(xiàn)右側(cè)、左側(cè)和底部彈出菜單
這篇文章主要為大家詳細(xì)介紹了Android PopupWindow實(shí)現(xiàn)右側(cè)、左側(cè)和底部彈出菜單的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11Android編程基于自定義view實(shí)現(xiàn)公章效果示例【附源碼下載】
這篇文章主要介紹了Android編程基于自定義view實(shí)現(xiàn)公章效果,結(jié)合實(shí)例形式分析了Android使用自定義view進(jìn)行圖形繪制的相關(guān)操作技巧,并附帶完整實(shí)例源碼供讀者下載參考,需要的朋友可以參考下2017-11-11Android開(kāi)發(fā)筆記之: 數(shù)據(jù)存儲(chǔ)方式詳解
本篇文章是對(duì)Android中數(shù)據(jù)存儲(chǔ)方式進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Android實(shí)現(xiàn)簡(jiǎn)單的分頁(yè)效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡(jiǎn)單的分頁(yè)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11Android自定義可拖拽的懸浮按鈕DragFloatingActionButton
這篇文章主要介紹了Android自定義可拖拽的懸浮按鈕DragFloatingActionButton,需要的朋友可以參考下2017-06-06Android打開(kāi)WebView黑屏閃爍問(wèn)題排查
這篇文章主要介紹了Android打開(kāi)WebView黑屏閃爍問(wèn)題排查,文章通過(guò)詳細(xì)的代碼示例和圖文介紹WebView黑屏閃爍的問(wèn)題,感興趣的小伙伴可以跟著小編一起來(lái)學(xué)習(xí)2023-05-05Android實(shí)現(xiàn)用文字生成圖片的示例代碼
本篇文章主要介紹了Android實(shí)現(xiàn)用文字生成圖片的示例代碼,這里整理了詳細(xì)的代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-08-08