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

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

可以发现

 

 

转载于:https://my.oschina.net/u/3659224/blog/1530063

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值