Android BottomNavigationView與Fragment重建與重疊問題解決方法探索
簡(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頁面
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);
對(duì)同級(jí)每一個(gè)Fragment進(jìn)行監(jiān)聽,當(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,防止頁面重疊
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 頁面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可能未銷毀,延遲時(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重建與重疊問題解決方法探索的文章就介紹到這了,更多相關(guān)Android BottomNavigationView與Fragment內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android同步屏障機(jī)制sync barrier實(shí)例應(yīng)用詳解
這篇文章主要介紹了Android同步屏障機(jī)制sync barrier實(shí)例應(yīng)用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-02-02
20.5 語音合成(百度2016年2月29日發(fā)布的tts引擎)
編寫手機(jī)App時(shí),有時(shí)需要使用文字轉(zhuǎn)語音(Text to Speech)的功能,比如開車時(shí)閱讀收到的短信、導(dǎo)航語音提示、界面中比較重要的信息通過語音強(qiáng)調(diào)2016-03-03
Android檢測(cè)url地址是否可達(dá)的兩種方法
今天小編就為大家分享一篇Android檢測(cè)url地址是否可達(dá)的兩種方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01
android開發(fā)環(huán)境搭建詳解(eclipse + android sdk)
這篇文章主要介紹了android開發(fā)環(huán)境搭建詳解(eclipse + android sdk),需要的朋友可以參考下2014-05-05
擁抱kotlin之如何習(xí)慣使用kotlin高階函數(shù)
這篇文章主要給大家介紹了關(guān)于擁抱kotlin之如何習(xí)慣使用kotlin高階函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用kotlin具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
android開發(fā)中獲取手機(jī)分辨率大小的方法
不管是在我們的布局還是在實(shí)現(xiàn)代碼中進(jìn)行操控,我們的靈活性都不是局限于一個(gè)固定的數(shù)值,而是面對(duì)不同的手機(jī)對(duì)象都有一個(gè)適應(yīng)的數(shù)值。2013-04-04
關(guān)于Android WebView的loadData方法的注意事項(xiàng)分析
本篇文章是對(duì)Android中WebView的loadData方法的注意事項(xiàng)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
Android ViewFlipper的簡(jiǎn)單使用
這篇文章主要為大家詳細(xì)介紹了Android ViewFlipper的簡(jiǎn)單使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06

