Fragment界面缓存问题
在上一篇博客中, 记录了Fragment中的两个问题,
1.使用replace替换FragmentB时,editext必须显示我给的默认值。
2.当我显示FragmentB时,点击home键,再打开应用时必须保留EditText修改后的值。
由于Fragment界面缓存问题, 对界面的修改无法放在onCreateView和onActivityCreated方法中, 因为除了第一次加载可以正常显示界面, 之后再次调用Fragment只会显示上次缓存的内容.
而如果把对界面的修改语句写在onStart或onResume方法中, 每次息屏再重新打开应用时都会重新加载onStart和onResume方法, 导致我们上一次输入的值被再次初始化了.
在上一篇文章中我使用Fragment的getArguments方法, 获取和Fragment绑定的bundle数据, 利用这个bundle保存息屏时的数据, 然后再onStart或onResume方法中获取这个数据显示在界面中.
上面虽然解决了问题,但是一旦界面需要保存的状态较多的话,整个代码就会看起来十分的混乱,当然也可以直接在getArguments保存一个标志位用来判断当前Fragment状态,是从其他Fragment跳转过来,还是按home键又重新打开的状态从而判断onResume方法中是否需要进行数据更新。
通过之前的结果可以发现,Fragment必然是在onStart之前onActivityCreated之后对界面进行了绘制,将缓存内容重新展示了出来。然后我就去搜了Fragment的源码看了onActivityCreated这个方法
在上面的方法介绍中看到了onViewStateRestored方法,这个方法在onActivityCreated方法之后运行,且一看名字就知道必然和界面缓存有关,之后又全局搜了这个方法,(其实就在onActivityCreated方法下面)
通过该方法的描述可以发现,这个方法就是用来显示View之前保存的状态的,且这个方法运行在onActivityCreated方法之后,onStart方法之前,在这个方法里面做更新View的操作是可以生效的,而且,按home键又重新打开应用时是不会调用这个方法的,这样一来只要把更新界面的代码写在这个方法里,就可以解决上面的两个问题了。这个方法和onSaveInstanceState方法才是真正对应的两个方法,虽然onCreateView和onActivityCreated方法都持有savedInstanceState的值,但是Fragment界面的重新绘制是在onViewStateRestored方法里的。
用了这么久的Fragment都还不知道有这么一个方法,这次也是刚好看到源码里面的介绍才了解到的,虽然自己在阅读源码这方面还十分的欠缺,但是,很多细小的知识点都是藏在其中,想要让自己的能力有所提升,阅读源码是必不可少的.