几种底部导航栏的分析

        总体上,安卓有两种方式去实现底部导航栏,下面的几个选择项可以不做分类,可以是RadioGroup,Tablayout,

FragmentTabHost,自定义view的还有BottomNavigationView,而容器则分为viewPager和固定容器(如FrameLayout等)。

        下面几个选项用哪个方式区别不大,只是难易的关系。而容器则有区分。

         用viewPager有侧滑的效果,当然也可以禁掉。按需求来,如果需要侧滑的话就可以用viewPager,但是有问题

        ①有错乱问题,需要写setOffscreenPageLimit

        ②一进到这个页面,如果有请求的话,每个页面都会执行一遍。

        这样的话如果只是底部点击切换页面的时候需要侧滑的效果,可以选择动画,然后可以使用FrameLayout的容器来实现

底部导航栏的效果。

         代码如下:

          (1)加入第一个fragment

//先加入第一个Fragment
FragmentManager fragmentManager=getSupportFragmentManager();

FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();

fragmentTransaction.add(R.id.home_container,mFragments[0]);

fragmentTransaction.commit();

         (2)点击的时候判断Fragment是否为空,然后进行替换

if(mFragments!=null){
    getSupportFragmentManager().beginTransaction().replace(R.id.home_container,mFragment).commit();
}

      以上是使用了replace的方法

     到此,还是又发现了问题,比如一个Fragment有RecycerView,已经滑到了第5项,但是切换一下回来的时候会出现,重新选择第一项的问题,有时候需求上是记录上一次的界面,虽然能解决,但是效果很不好。

    从源码上来看,使用replace的时候执行了removeFragment和addFragment的方法,也就是直接重新去请求了Frament的生命周期,这样资源浪费了。

   废话不多说,解决方法就是使用FragmentManager的getFragments获取到所有的容器中的Fragment,先将所有的Fragment隐藏,接着判断当前点击的Fragment是否在getFragments中存在,如果不存在就添加到容器中,存在就直接显示。

    代码如下:

    

List<Fragment> childFragments = mFragmentManager.getFragments();
FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
//1.隐藏所有的
for (Fragment childFragment : childFragments) {

    fragmentTransaction.hide(childFragment);

}
//2.如果容器里面没有就添加,否则显示
if (!childFragments.contains(fragment)) {
    fragmentTransaction.add(R.id.home_container, fragment);
} else {
    fragmentTransaction.show(fragment);

}
fragmentTransaction.commit();
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值