Android BottomNavigationView與Fragment重建與重疊問(wèn)題解決方法探索
簡(jiǎn)介
在BottomNavigationView+多個(gè)Fragment框架下,進(jìn)行Fragment切換時(shí),會(huì)導(dǎo)致Fragment重建,也會(huì)出現(xiàn)同級(jí)Fragment未hide,導(dǎo)致重疊
解決方法
第一步
初始化一個(gè)默認(rèn)需要顯示的Fragment頁(yè)面
public void InitFragment(Bundle savedInstanceState) { //判斷activity是否重建,如果不是,則不需要重新建立fragment. if (savedInstanceState == null) { fragmentManager = getSupportFragmentManager(); fragmentTransaction = fragmentManager.beginTransaction(); if (mMovie == null) { mMovie = new HomeFragment(); } CurrentFragment = mMovie; fragmentTransaction.replace(R.id.nav_host_fragment_activity_main, mMovie).commit();//fragment parent layout id } }
第二步
監(jiān)聽(tīng)BottomNavigationView切換事件
binding.navView.setOnNavigationItemSelectedListener(listener);
對(duì)同級(jí)每一個(gè)Fragment進(jìn)行監(jiān)聽(tīng),當(dāng)進(jìn)行切換的時(shí)候,對(duì)其狀態(tài)進(jìn)行show或者h(yuǎn)ide
private BottomNavigationView.OnNavigationItemSelectedListener listener = new BottomNavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull @NotNull MenuItem item) { switch (item.getItemId()) { case R.id.navigation_home: if (mMovie == null) { mMovie = new HomeFragment(); } switchContent(CurrentFragment, mMovie); return true; case R.id.navigation_dashboard: if (mExplore == null) { mExplore = new ExploreFragment(); } switchContent(CurrentFragment, mExplore); return true; case R.id.navigation_notifications: if (mLibrary == null) { mLibrary = new LibraryFragment(); } switchContent(CurrentFragment, mLibrary); return true; case R.id.navigation_member: if (mMember == null) { mMember = new MemberFragment(); } switchContent(CurrentFragment, mMember); return true; } return false; } };
第三步
此為對(duì)原Fragment進(jìn)行隱藏,對(duì)要跳轉(zhuǎn)的Fragment進(jìn)行show,防止頁(yè)面重疊
public void switchContent(Fragment from, Fragment to) { if (from == null || to == null) return; if (CurrentFragment != to) { CurrentFragment = to; fragmentManager = getSupportFragmentManager(); fragmentTransaction = fragmentManager.beginTransaction(); if (!to.isAdded()) { //fragment parent layout id fragmentTransaction.hide(from).add(R.id.nav_host_fragment_activity_main, to).commit(); } else { fragmentTransaction.hide(from).show(to).commit(); } } }
使用
private FragmentManager fragmentManager; private FragmentTransaction fragmentTransaction; private HomeFragment mMovie = null; private ExploreFragment mExplore = null; private LibraryFragment mLibrary = null; private MemberFragment mMember = null; private Fragment CurrentFragment = null;
InitFragment(savedInstanceState); binding.navView.setOnNavigationItemSelectedListener(listener);
同級(jí)Fragment跳轉(zhuǎn)
當(dāng)BottomNavigationView中的同級(jí)Fragment需要進(jìn)行跳轉(zhuǎn)時(shí),可使用EventBus進(jìn)行跨進(jìn)程通信實(shí)現(xiàn),然后拿到BottomNavigationView實(shí)例進(jìn)行切換即可,此id為需要跳轉(zhuǎn)的Fragment 頁(yè)面ID
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true) public void OnEvent(ChangeFragBean bean) { binding.navView.setSelectedItemId(R.id.navigation_dashboard); }
Activity跳轉(zhuǎn)到Fragment
同樣使用EventBus,從一個(gè)Activity跳轉(zhuǎn)到BottomNavigationView的某個(gè)Fragment時(shí),需要加一個(gè)延遲執(zhí)行,因?yàn)锳ctivity可能未銷(xiāo)毀,延遲時(shí)間,根據(jù)具體手機(jī)性能決定,大致在300-500毫秒即可
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true) public void OnEvent(MermberBean bean) { Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { /** *要執(zhí)行的操作 */ binding.navView.setSelectedItemId(R.id.navigation_member); } }, 250);//3秒后執(zhí)行Runnable中的run方法 }
到此這篇關(guān)于Android BottomNavigationView與Fragment重建與重疊問(wèn)題解決方法探索的文章就介紹到這了,更多相關(guān)Android BottomNavigationView與Fragment內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
AFURLSessionManager 上傳下載使用代碼說(shuō)明
本文通過(guò)代碼給大家介紹了AFURLSessionManager 上傳下載使用說(shuō)明,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-09-09在Android模擬器上模擬GPS功能總是null的解決方法
在我們開(kāi)發(fā)時(shí)需要在模擬器上模擬GPS,可在Location的時(shí)候總是null,下面與大家分享下具體的解決方法,感興趣的朋友可以參考下哈2013-06-065分鐘學(xué)會(huì)Android設(shè)計(jì)模式之策略模式Strategy Pattern教程
這篇文章主要為大家介紹了5分鐘學(xué)會(huì)Android設(shè)計(jì)模式之策略模式Strategy Pattern教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Kotlin中的對(duì)象表達(dá)式和對(duì)象聲明的具體使用
這篇文章主要介紹了Kotlin中的對(duì)象表達(dá)式和對(duì)象聲明的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11詳解Android App中使用VideoView來(lái)實(shí)現(xiàn)視頻播放的方法
這篇文章主要介紹了Android App中使用VideoView來(lái)實(shí)現(xiàn)視頻播放的方法,舉例講解了VideoView組件中setVidePath(String path)和setVideoURI(Uri uri)的用法,需要的朋友可以參考下2016-04-04android支付寶客戶(hù)端html5網(wǎng)頁(yè)無(wú)法自動(dòng)關(guān)閉問(wèn)題的解決方法
這篇文章主要為大家詳細(xì)介紹了android支付寶客戶(hù)端html5網(wǎng)頁(yè)無(wú)法自動(dòng)關(guān)閉問(wèn)題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04Android自定義UI實(shí)現(xiàn)微信語(yǔ)音
這篇文章主要為大家詳細(xì)介紹了Android自定義UI實(shí)現(xiàn)微信語(yǔ)音的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11Android自定義ViewGroup實(shí)現(xiàn)堆疊頭像的點(diǎn)贊Layout
這篇文章主要介紹了 Android自定義ViewGroup實(shí)現(xiàn)堆疊頭像的點(diǎn)贊Layout,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10Android的HTTP擴(kuò)展包OkHttp中的緩存功能使用方法解析
OkHttp(GitHub主頁(yè)https://github.com/square/okhttp)是一款高人氣的第三方Android網(wǎng)絡(luò)編程包,這里我們來(lái)看一下Android的HTTP擴(kuò)展包OkHttp中的緩存功能使用方法解析:2016-07-07Android實(shí)現(xiàn)簡(jiǎn)單點(diǎn)贊動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡(jiǎn)單點(diǎn)贊動(dòng)畫(huà),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08