【问题标题】:Lifecycle problem when use FragmentStatePagerAdapter, Fragments使用 FragmentStatePagerAdapter、Fragments 时的生命周期问题
【发布时间】:2020-04-17 15:43:00
【问题描述】:
我正在使用 FragmentStatePagerAdapter、ViewPager。
我将使用 onSaveInstanceState 通过覆盖来保存一些状态,例如每个片段中 EditText 的光标位置。
但是当我选择第一个片段然后选择第二个片段时,第一个片段的onSaveInstanceState没有被调用。如果我选择第一个,然后选择第三个片段,则调用第一个片段的onSaveInstanceState。
在选择第一个片段和下一个第二个片段的情况下,即使第一个片段的onPause也不会被调用。
什么原因?我怎么解决这个问题?我整天都在研究这个问题。但我还没有找到解决方案和正确的理由。
onSaveInstanceState 有可以调用的情况,但是 onPause 呢?为什么不调用 onPause?
【问题讨论】:
标签:
android
android-fragments
android-viewpager
onsaveinstancestate
【解决方案1】:
我找到了解决方案。我使用了 setUserVisibleHint。
在片段中,我在 setUserVisibleHint 中编写了保存和恢复逻辑。
它运作良好。
当显示或隐藏片段时调用它。
我还用onViewStateRestored、onSaveInstanceState一起处理被破坏的情况。
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(isVisibleToUser) {
if (mInputFrom != null) {
if(isToFocus) {
mInputFrom.requestFocus();
mInputFrom.setSelection(fromCursor);
} else {
mInputOut.requestFocus();
mInputOut.setSelection(toCursor);
}
}
} else {
if (mInputFrom != null) {
fromCursor = mInputFrom.getSelectionStart();
toCursor = mInputOut.getSelectionStart();
}
}
}
setUservisibleHint 已弃用。
所以其他选择是我们可以使用 FragmentStatePagerAdapter(fm, BEHAVIOR_SET_USER_VISIBLE_HINT); 的构造函数;
如果我们在扩展FragmentStatePagerAdapter的自定义Adapter的构造函数中调用super的构造函数,那么每个情况都会调用片段的onPause,onResume被隐藏或显示。
我认为第一个选项适合我的情况。所以我使用了第一个选项并且已经完美解决了。