如何保存手动设置ViewPager碎片的InstanceState(深入解释)?

时间:2014-02-07 10:59:22

标签: android android-fragments android-view android-fragmentactivity fragmentstatepageradapter

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

0 个答案:

没有答案