您的位置:首页 > 其它

关于多个fragment复用同一个占位View产生的问题及解决

2017-09-06 00:00 387 查看
在大多数项目中都会用到点击标签栏切换页面这种功能,它的实现方式也有多种,从最早的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 方法



可以发现
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐