我有一个ViewPager(用 FragmentStatePagerAdapter 实例化),并附加了一些Fragment。
在特定用例中,我需要为寻呼机中的大多数片段重置instanceBean和UI。
经过一些谷歌搜索后,我尝试了一些像this这样的解决方案,但副作用并不容易管理。像this这样的其他解决方案并不符合我的需求。
所以我决定直接使用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);
}
为什么我会在重置之前设置每一页?
因为解释here:
当用户看不到页面时,他们的整个片段可能会被破坏,只保留该片段的保存状态。
并且因为直到我没有选择相对片段,才会执行 @AfterViews方法(即片段的OnCreateView之后立即处理的所有内容)。 抛出NullPointerException有很多原因(通常在@AfterViews方法中启动RestoreState方法,初始化适配器,执行UI操作)。
在重置之前设置相对页面,让@AfterViews方法处理。
在检查旋转设备时会发生什么之前,我需要的所有片段都会被正确重置。
旋转设备时,出现错误:
视图(主要是EditText)回到之前的状态 BEFORE 我的重置。
当在页面之间切换时,在某一点上,页面将被销毁,并且每次为每个页面调用OnSavedInstanceState。
我已经处理过OnSavedInstanceState(如上所述),当布尔值为false时,保存状态就好像它刚刚被创建一样。
我发现在AfterView方法中,EditText的文本设置为空白(就像我想要的那样),但继续调试EditText会回到之前的状态,所以最后它会显示它的最后一个文本
如何在销毁/重新创建片段后保留手动设置(在OnSavedInstanceState中)EditText文本?