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