在大多数项目中都会用到点击标签栏切换页面这种功能,它的实现方式也有多种,从最早的tabhost+view,tablayout+viewpager,textview+viewpager,RadiuButton + FrameLayout 以及后面出的BottomNavigationView等等,原理都是用一个占位View承载fragment,通过点击标签或者滑动来切换不同的页面。
关于替换的方式
占位view的最常见的一种写法
这样就相当于用这个View搭载了Frgament。直接这样写本来是没问题的,但是如果类中有网络请求这样的耗时任务,快速频繁的切换会导致崩溃,NoPointerException,ResouceNotFoundException。
解决方法,给每一个frgament都绑定一个View,不要共用一个View,通过view.setVisibility的方式控制显示隐藏,然后就完美解决崩溃的问题。
之后想想如果有多个fragment来回切换, 并且页面中有edittext 输入框的话,.replace方法每次都会重新实例化fragment,导致前面我们填的内容丢失。更加优雅的方式是使用Fragment提供的事务FragmentTransaction,然后用add的方法,而不是每次都用replace。
在获取FragmentTransaction对象后调用add方法。在add之前断一下Fragment对象是否为空,不为空的话就用ft的hide方法把Fragment隐藏起来,然会出现布局重叠的情况。
public void hideFragment(FragmentTransaction ft){
if (oneFm!=null){
ft.hide(oneFm); }}
然后自行对比一下切换后输入框内容区别:
replace方法
add 方法
可以发现