Fragment显示问题

Fragment显示问题,界面缓存及设置默认值问题

最近遇到了一个关于Fragment的显示问题。我的需求是这样的,在一个Activity中我有两个按钮A和B分别控制FragmentA和FragmentB的显示,
FragmentB中有一个EditText,当我显示FragmentB时会传一个值给EditText用于默认显示。
我现在的要求是:
1.使用replace替换FragmentB时,editext必须显示我给的默认值。
2.当我显示FragmentB时,点击home键,再打开应用时必须保留EditText修改后的值。
乍一看,这两个需求很简单,首先在FragmentB中设置一个变量用于接收Activity传过来的默认值,
这里写图片描述

但是这样一来就无法实现上述的第二点,因为点击home键再重启应用时,会调用Fragment的onResume方法又会给editText设置默认值,而这种情况的时候我们是想保留editText的修改值的。
这时候想到的第一个就是避开onStart,onResume,因为在Fragment重新获得焦点的时候会调用这两个方法,然后就理所当然的直接将赋值写在onCreateView中

这里写图片描述

运行之后会发现除了第一次显示Fragment正常后,第二次,第三次就出现了问题,

这里写图片描述

当我修改EditText然后再切换Fragment时,发现FragmentB保留了上次修改的结果,也就是说onCreateView中的setText()没有起到作用。

这里写图片描述

当我修改EditText然后再切换Fragment时,发现FragmentB保留了上次修改的结果,也就是说onCreateView中的setText()没有起到作用。

这里写图片描述
这里写图片描述

一开始我以为是不能在onCreateView里面进行赋值,后来将EditText的赋值语句移到onViewCreate 和 onActivityCreated中也还是不行,但是在onStart和onResume中就可以,这下尴尬了,上述的两种效果竟然无法同时达到,这也让我意识到Fragment对View的绘制比Activity要来的复杂。

这里有一个非常简单粗暴的方法就是每次显示FragmentB的时候都新建一个FragmentB,这样把EditText的赋值直接写在onCreateView中就能起到效果,当然作为一个有追求的程序猿是不会用这种没有技术含量的方法。

之后我想到的是能不能在Fragment消失时保存EditText的修改值,然后Fragment重新获取焦点的时候再给它赋值,这里我想到的是Activity的onSaveInstanceState和onRestoreInstanceState方法,Fragment中没有onRestoreInstanceState方法,相对应的它可以从onActivityCreated方法中获取保存的数据。但是问题来了,Fragment按home键又重新启动的时候是不会调用onActivityCreated方法的。

后来我突然灵光一闪,想到Fragment不是本身就有一个Bundle吗,即Fragmen的setArguments和getArguments方法,这样一来就有办法了,我在设置默认值和调用onPause方法时将默认值和EditText的修改值,利用setArguments方法存入Bundle中,在onResume方法中调用getArgument方法获取EditText最终显示的值。这样就完美实现了上述的两个要求。

这里写图片描述

虽然只是很简单的两个需求,但是实现起来没想到有这么多问题,这里我还是没有弄清楚Fragment是如何绘制界面的,我认为应该是Fragment缓存了界面修改,然后再onStart或onStart之前的生命周期方法中调用之前的缓存去绘制界面导致在onStart方法前比如onCreateView方法中无法修改界面的显示,不过具体是怎么实现的我还没有搞清楚,必须要深入源码中才能知道到底是如何缓存的。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值