美文网首页
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