BottomNavigationBar嵌套fragment重復(fù)加載

今天朋友問(wèn)了我BottomNavigationBar嵌套fragment重復(fù)加載的問(wèn)題,我以前處理過(guò)fragment重復(fù)加載,但是突然間忘了,這可能就是不寫(xiě)博客的壞處吧,沒(méi)有記憶。BottomNavigationBar也是我第一次接觸,所以寫(xiě)篇文章增強(qiáng)下記憶。

BottomNavigationBar是谷歌去年3月份推出的MD風(fēng)格的導(dǎo)航欄控制器。先看看官方給的效果圖吧


1458286306136380.png

感覺(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) {

}

好了,核心代碼就這么多了,下邊是效果圖

QQ圖片20170414172912.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,034評(píng)論 25 709
  • afinalAfinal是一個(gè)android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,873評(píng)論 2 45
  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程,因...
    小菜c閱讀 7,329評(píng)論 0 17
  • “五.一”節(jié)一過(guò),接下來(lái)的節(jié)日就是端午節(jié)。(今年是5月30日)端午節(jié),為追懷屈原外,我們熟悉的有龍舟賽、食...
    張漪紋閱讀 1,060評(píng)論 0 5
  • 是誰(shuí)為殘缺的月亮祈福 點(diǎn)上滿天流淚的蠟燭 殘缺的月亮 憂愁的月亮 照亮了多少情感的悲傷
    戈樂(lè)閱讀 294評(píng)論 0 4

友情鏈接更多精彩內(nèi)容