2

我有一个 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 文本?

4

0 回答 0