我有一个 ViewPager (用FragmentStatePagerAdapter实例化),上面附有一些 Fragment。
在特定用例中,我需要为寻呼机中的大多数片段重置 instanceBean 和 UI。
经过一番谷歌搜索后,我尝试了一些这样的解决方案,但副作用不容易管理。像这样的其他解决方案不符合我的需求。
所以我决定直接手动重置UI 和 instanceBean obj,如下面的代码所示:
编码
单片断重置
public void initFragment() {
notaBean = new NoteFragmentTO();
fromSpinnerListener = false;
}
public void resetFragment() {
initFragment();
NoteFragment.retainInstanceState = false;
}
这是通过父 Activity 中的以下代码完成的:
从父级重置片段
private void resetAfterSaving() {
mIndicator.setCurrentItem(POSITION_F*****);
f*****Info.resetFragment();
mIndicator.setCurrentItem(POSITION_NOTE);
noteInfo.resetFragment();
mIndicator.setCurrentItem(POSITION_M*****);
m*****Info.resetFragment();
mIndicator.setCurrentItem(POSITION_V*****);
v*****.resetFragment();
}
AfterViews 方法:
@AfterViews
public void afterView() {
if (mSavedInstanceState != null) {
restoreState(mSavedInstanceState);
}
NoteFragment.retainInstanceState = true;
// Inits the adapters
noteAdapter = new NoteArrayAdapter(this, noteDefaultList);
sp_viol_nota_default.setAdapter(noteAdapter);
//sp_viol_nota_default.seton
et_viol_nota.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
String readText = et_viol_nota.getText().toString().trim();
notaBean.setNota(readText == "" ? null : readText);
}
}
});
}
OnSavedInstanceState
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelableArrayList(KEY_NOTE_D_LIST, (ArrayList<VlzAnagraficaNoteagente>) noteDefaultList);
outState.putInt(KEY_NOTE_D_POSITION, !NoteFragment.retainInstanceState ? 0 : notePosition);
notaBean.setNota(!NoteFragment.retainInstanceState ? "" : et_viol_nota.getText().toString().trim());
outState.putParcelable(NoteFragmentTO.INTENT_KEY, notaBean);
}
为什么我要在重置之前设置每一页?
因为就像这里解释的那样:
当页面对用户不可见时,它们的整个片段可能会被销毁,只保留该片段的已保存状态。
并且因为直到我不选择相对片段,@AfterViews 方法(即在片段的 OnCreateView 之后立即处理的所有内容)都不会执行。这会出于一千个原因引发 NullPointerException(通常在 @AfterViews 方法中您启动 RestoreState 方法,初始化适配器,执行 UI 操作)。
在重置之前设置相关页面让 @AfterViews 方法被处理。
在检查旋转设备时会发生什么之前,我需要的所有片段都已正确重置。
旋转设备时,出现错误:
在我重置之前,视图(主要是 EditText)会回到它们以前的状态。
怎么了?
在页面之间切换时,页面会在某个时间点被销毁,并且每次对每个页面调用 OnSavedInstanceState。
我已经处理了 OnSavedInstanceState (如上),当布尔值为 false 时,它会保存状态,就像它刚刚创建时一样。
我发现直到在 AfterView 方法中,EditText 的文本设置为空白(就像我想要的那样),但继续调试 EditText 会回到它以前的状态,所以最后它会显示它拥有的最后一个文本。
问题
如何在销毁/重新创建片段后保留手动设置(在 OnSavedInstanceState 中)EditText 文本?