美文网首页
BottomNavigationBar嵌套fragment重复加

BottomNavigationBar嵌套fragment重复加

作者: NOW_DAY | 来源:发表于2017-04-14 17:30 被阅读0次

今天朋友问了我BottomNavigationBar嵌套fragment重复加载的问题,我以前处理过fragment重复加载,但是突然间忘了,这可能就是不写博客的坏处吧,没有记忆。BottomNavigationBar也是我第一次接触,所以写篇文章增强下记忆。

BottomNavigationBar是谷歌去年3月份推出的MD风格的导航栏控制器。先看看官方给的效果图吧


1458286306136380.png

感觉还是挺好看的

在此我就上传代码了,简单说下
1.如何使用
gradle 中引用 compile 'com.ashokvarma.android:bottom-navigation-bar:1.2.0'

2.那就开始代码吧
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类中实现BottomNavigationBar.OnTabSelectedListener然后生成

public void onTabSelected(int position) {

 //  点击Item时调用此方法 

}

@Override
public void onTabUnselected(int position) {
 //  对没有选中的Item进行处理的方法,
}

@Override
public void onTabReselected(int position) {
// 当被选中的Item 再一次被点击时调用此方法
}

2.3在activity中的使用

 BottomNavigationBar bottomNavigationBar = (BottomNavigationBar) findViewById(R.id.bottom_navigation_bar);
    //设置模式(MODE_DEFAULT:如果Item的个数<=3就会使用MODE_FIXED模式,否则使用MODE_SHIFTING模式。MODE_FIXED 是填充模式,未选中的Item会显示文字,没有移位动画。MODE_SHIFTING:
    //移位模式,未选中的Item不会显示文字,选中的会显示文字。在切换的时候会有一个像移位的动画)
    bottomNavigationBar.setMode(BottomNavigationBar.MODE_FIXED);
    //设置背景样式( BACKGROUND_STYLE_STATIC 点击的时候没有水波纹效果,BACKGROUND_STYLE_RIPPLE 点击的时候有水波纹效果,如果设置的Mode为MODE_FIXED,将使用BACKGROUND_STYLE_STATIC 。如果Mode为MODE_SHIFTING将使用BACKGROUND_STYLE_RIPPLE。)
    bottomNavigationBar
            .setBackgroundStyle(BottomNavigationBar.BACKGROUND_STYLE_STATIC
            );

    // 添加Item,设置选中的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();
    //设置默认的Item
    setDefaultFragment();
    //监听实现的方法
    bottomNavigationBar.setTabSelectedListener(this);

2.4设置默认的item

/**
 * 设置默认的Item
 */
private void setDefaultFragment() {
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction transaction = fm.beginTransaction();
    transaction.replace(R.id.layFrame, HomeFragment.newInstance("Home"));
    transaction.commit();
}

2.5将实例化Fragment放入数组

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在实现方法里进行切换fragment

public void onTabSelected(int position) {

    if (fragments != null) {
        if (position < fragments.size()) {
            FragmentManager fm = getSupportFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();
            //当前的fragment
            Fragment from = fm.findFragmentById(R.id.layFrame);
            //点击即将跳转的fragment
            Fragment fragment = fragments.get(position);
            if (fragment.isAdded()) {
                // 隐藏当前的fragment,显示下一个
                ft.hide(from).show(fragment);
            } else {
                / 隐藏当前的fragment,add下一个到Activity中
                ft.hide(from).add(R.id.layFrame, fragment); /
            }
            ft.commitAllowingStateLoss();
        }
    }else {

// 隐藏当前的fragment,add下一个到Activity中
ft.hide(from).add(R.id.layFrame, fragment);
if (fragment.isHidden()) {
ft.show(fragment);
Logger.d("被隐藏了");
}
}

}

@Override
public void onTabUnselected(int position) {
    //这儿也要操作隐藏,否则Fragment会重叠
    if (fragments != null) {
        if (position < fragments.size()) {
            FragmentManager fm = getSupportFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();
            Fragment fragment = fragments.get(position);
            // 隐藏当前的fragment
            ft.hide(fragment);
            ft.commitAllowingStateLoss();
        }
    }
}

@Override
public void onTabReselected(int position) {

}

好了,核心代码就这么多了,下边是效果图

QQ图片20170414172912.png

如果有什么问题给我留言吧,欢迎给我指错。。。
感谢相公无爱的纠错,已改正

相关文章

网友评论

      本文标题:BottomNavigationBar嵌套fragment重复加

      本文链接:https://www.haomeiwen.com/subject/gbzwattx.html