今天朋友問(wèn)了我BottomNavigationBar嵌套fragment重復(fù)加載的問(wèn)題,我以前處理過(guò)fragment重復(fù)加載,但是突然間忘了,這可能就是不寫(xiě)博客的壞處吧,沒(méi)有記憶。BottomNavigationBar也是我第一次接觸,所以寫(xiě)篇文章增強(qiáng)下記憶。
BottomNavigationBar是谷歌去年3月份推出的MD風(fēng)格的導(dǎo)航欄控制器。先看看官方給的效果圖吧

感覺(jué)還是挺好看的
在此我就上傳代碼了,簡(jiǎn)單說(shuō)下
1.如何使用
gradle 中引用 compile 'com.ashokvarma.android:bottom-navigation-bar:1.2.0'
2.那就開(kāi)始代碼吧
2.1 xml 文件中引用
<FrameLayout
android:id="@+id/mFrame"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<com.ashokvarma.bottomnavigation.BottomNavigationBar
android:id="@+id/bottom_navigation_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom" />
2.2在Activity類中實(shí)現(xiàn)BottomNavigationBar.OnTabSelectedListener然后生成
public void onTabSelected(int position) {
// 點(diǎn)擊Item時(shí)調(diào)用此方法
}
@Override
public void onTabUnselected(int position) {
// 對(duì)沒(méi)有選中的Item進(jìn)行處理的方法,
}
@Override
public void onTabReselected(int position) {
// 當(dāng)被選中的Item 再一次被點(diǎn)擊時(shí)調(diào)用此方法
}
2.3在activity中的使用
BottomNavigationBar bottomNavigationBar = (BottomNavigationBar) findViewById(R.id.bottom_navigation_bar);
//設(shè)置模式(MODE_DEFAULT:如果Item的個(gè)數(shù)<=3就會(huì)使用MODE_FIXED模式,否則使用MODE_SHIFTING模式。MODE_FIXED 是填充模式,未選中的Item會(huì)顯示文字,沒(méi)有移位動(dòng)畫(huà)。MODE_SHIFTING:
//移位模式,未選中的Item不會(huì)顯示文字,選中的會(huì)顯示文字。在切換的時(shí)候會(huì)有一個(gè)像移位的動(dòng)畫(huà))
bottomNavigationBar.setMode(BottomNavigationBar.MODE_FIXED);
//設(shè)置背景樣式( BACKGROUND_STYLE_STATIC 點(diǎn)擊的時(shí)候沒(méi)有水波紋效果,BACKGROUND_STYLE_RIPPLE 點(diǎn)擊的時(shí)候有水波紋效果,如果設(shè)置的Mode為MODE_FIXED,將使用BACKGROUND_STYLE_STATIC 。如果Mode為MODE_SHIFTING將使用BACKGROUND_STYLE_RIPPLE。)
bottomNavigationBar
.setBackgroundStyle(BottomNavigationBar.BACKGROUND_STYLE_STATIC
);
// 添加Item,設(shè)置選中的Item,初始化
bottomNavigationBar.addItem(new BottomNavigationItem(R.mipmap.ic_home_white_24dp, "Home").setActiveColorResource(R.color.orange))
.addItem(new BottomNavigationItem(R.mipmap.ic_book_white_24dp, "Books").setActiveColorResource(R.color.teal))
.addItem(new BottomNavigationItem(R.mipmap.ic_music_note_white_24dp, "Music").setActiveColorResource(R.color.blue))
.addItem(new BottomNavigationItem(R.mipmap.ic_videogame_asset_white_24dp, "Games").setActiveColorResource(R.color.grey))
.setFirstSelectedPosition(0)
.initialise();
fragments = getFragments();
//設(shè)置默認(rèn)的Item
setDefaultFragment();
//監(jiān)聽(tīng)實(shí)現(xiàn)的方法
bottomNavigationBar.setTabSelectedListener(this);
2.4設(shè)置默認(rèn)的item
/**
* 設(shè)置默認(rèn)的Item
*/
private void setDefaultFragment() {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
transaction.replace(R.id.layFrame, HomeFragment.newInstance("Home"));
transaction.commit();
}
2.5將實(shí)例化Fragment放入數(shù)組
private ArrayList<Fragment> getFragments() {
ArrayList<Fragment> fragments = new ArrayList<>();
fragments.add(HomeFragment.newInstance("Home"));
fragments.add(BookFragment.newInstance("Books"));
fragments.add(MusicFragment.newInstance("Music"));
fragments.add(GameFragment.newInstance("Games"));
return fragments;
}
2.6在實(shí)現(xiàn)方法里進(jìn)行切換fragment
public void onTabSelected(int position) {
if (fragments != null) {
if (position < fragments.size()) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
//當(dāng)前的fragment
Fragment from = fm.findFragmentById(R.id.layFrame);
//點(diǎn)擊即將跳轉(zhuǎn)的fragment
Fragment fragment = fragments.get(position);
if (fragment.isAdded()) {
// 隱藏當(dāng)前的fragment,顯示下一個(gè)
ft.hide(from).show(fragment);
} else {
/ 隱藏當(dāng)前的fragment,add下一個(gè)到Activity中
ft.hide(from).add(R.id.layFrame, fragment); /
}
ft.commitAllowingStateLoss();
}
}else {
// 隱藏當(dāng)前的fragment,add下一個(gè)到Activity中
ft.hide(from).add(R.id.layFrame, fragment);
if (fragment.isHidden()) {
ft.show(fragment);
Logger.d("被隱藏了");
}
}
}
@Override
public void onTabUnselected(int position) {
//這兒也要操作隱藏,否則Fragment會(huì)重疊
if (fragments != null) {
if (position < fragments.size()) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
Fragment fragment = fragments.get(position);
// 隱藏當(dāng)前的fragment
ft.hide(fragment);
ft.commitAllowingStateLoss();
}
}
}
@Override
public void onTabReselected(int position) {
}
好了,核心代碼就這么多了,下邊是效果圖

如果有什么問(wèn)題給我留言吧,歡迎給我指錯(cuò)。。。
感謝相公無(wú)愛(ài)的糾錯(cuò),已改正