Android BottomNavigationView與Fragment重建與重疊問題解決方法探索
簡介
在BottomNavigationView+多個Fragment框架下,進行Fragment切換時,會導致Fragment重建,也會出現(xiàn)同級Fragment未hide,導致重疊
解決方法
第一步
初始化一個默認需要顯示的Fragment頁面
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)聽BottomNavigationView切換事件
binding.navView.setOnNavigationItemSelectedListener(listener);
對同級每一個Fragment進行監(jiān)聽,當進行切換的時候,對其狀態(tài)進行show或者hide
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; } };
第三步
此為對原Fragment進行隱藏,對要跳轉(zhuǎn)的Fragment進行show,防止頁面重疊
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);
同級Fragment跳轉(zhuǎn)
當BottomNavigationView中的同級Fragment需要進行跳轉(zhuǎn)時,可使用EventBus進行跨進程通信實現(xiàn),然后拿到BottomNavigationView實例進行切換即可,此id為需要跳轉(zhuǎn)的Fragment 頁面ID
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true) public void OnEvent(ChangeFragBean bean) { binding.navView.setSelectedItemId(R.id.navigation_dashboard); }
Activity跳轉(zhuǎn)到Fragment
同樣使用EventBus,從一個Activity跳轉(zhuǎn)到BottomNavigationView的某個Fragment時,需要加一個延遲執(zhí)行,因為Activity可能未銷毀,延遲時間,根據(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重建與重疊問題解決方法探索的文章就介紹到這了,更多相關(guān)Android BottomNavigationView與Fragment內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
AFURLSessionManager 上傳下載使用代碼說明
本文通過代碼給大家介紹了AFURLSessionManager 上傳下載使用說明,代碼簡單易懂,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2017-09-09在Android模擬器上模擬GPS功能總是null的解決方法
在我們開發(fā)時需要在模擬器上模擬GPS,可在Location的時候總是null,下面與大家分享下具體的解決方法,感興趣的朋友可以參考下哈2013-06-065分鐘學會Android設(shè)計模式之策略模式Strategy Pattern教程
這篇文章主要為大家介紹了5分鐘學會Android設(shè)計模式之策略模式Strategy Pattern教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03詳解Android App中使用VideoView來實現(xiàn)視頻播放的方法
這篇文章主要介紹了Android App中使用VideoView來實現(xiàn)視頻播放的方法,舉例講解了VideoView組件中setVidePath(String path)和setVideoURI(Uri uri)的用法,需要的朋友可以參考下2016-04-04android支付寶客戶端html5網(wǎng)頁無法自動關(guān)閉問題的解決方法
這篇文章主要為大家詳細介紹了android支付寶客戶端html5網(wǎng)頁無法自動關(guān)閉問題的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04Android自定義ViewGroup實現(xiàn)堆疊頭像的點贊Layout
這篇文章主要介紹了 Android自定義ViewGroup實現(xiàn)堆疊頭像的點贊Layout,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10Android的HTTP擴展包OkHttp中的緩存功能使用方法解析
OkHttp(GitHub主頁https://github.com/square/okhttp)是一款高人氣的第三方Android網(wǎng)絡(luò)編程包,這里我們來看一下Android的HTTP擴展包OkHttp中的緩存功能使用方法解析:2016-07-07