天天看点

几种底部导航栏的分析

        总体上,安卓有两种方式去实现底部导航栏,下面的几个选择项可以不做分类,可以是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();