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