首页 文章

getSavedInstanceState()和onViewStateRestored()包的问题

提问于
浏览
0

我在Activity中有一个片段,当旋转设备时,会调用onSaveInstanceState()和onViewStateRestored() .

的onSaveInstanceState():

@Override
public void onSaveInstanceState(Bundle outState){
    Log.e("Fragment", "Called onSaveInstanceState");

    outState = getSavedInstanceState();

    super.onSaveInstanceState(outState);
}

这是在onSaveInstanceState()中设置outState包的原因:

public static Bundle getSavedInstanceState(){
    Bundle saveState = new Bundle();

    //Save view states
    saveState.putBoolean("startButtonVisible", buttonStart.getVisibility() == View.VISIBLE);
    saveState.putBoolean("stopButtonVisible", buttonStop.getVisibility() == View.VISIBLE);
    saveState.putBoolean("resetButtonVisible", buttonReset.getVisibility() == View.VISIBLE);
    saveState.putBoolean("saveButtonVisible", buttonSave.getVisibility() == View.VISIBLE);
    saveState.putBoolean("openLatestFileButtonVisible", buttonOpenLatestFile.getVisibility() == View.VISIBLE);

    saveState.putBoolean("editTextStartValueVisible", editTextStartValue.isEnabled());
    saveState.putBoolean("buttonStartValueDownVisible", buttonStartValueDown.isEnabled());
    saveState.putBoolean("buttonStartValueUpVisible", buttonStartValueUp.isEnabled());
    saveState.putBoolean("editTextEndValueVisible", editTextEndValue.isEnabled());
    saveState.putBoolean("buttonEndValueDownVisible", buttonEndValueDown.isEnabled());
    saveState.putBoolean("buttonEndValueUpVisible", buttonEndValueUp.isEnabled());

    return saveState;
}

这样可以正确保存数据,但是当调用onViewStateRestored()时,数据不正确 .

@Override
public void onViewStateRestored(Bundle savedInstanceState){
    Log.e("Fragment", "Called onViewStateRestored");

    super.onViewStateRestored(savedInstanceState);

    //Restore view states
    if (savedInstanceState != null){

        restoreInstanceState(savedInstanceState);

        if (buttonReset.getVisibility() == View.VISIBLE){
            updateUi();
        }
    }
}

当调用onViewStateRestored()时,它还调用restoreInstanceState(),这应该是恢复每个视图的状态 .

public static void restoreInstanceState(Bundle savedInstanceState){
    buttonStart.setVisibility(savedInstanceState.getBoolean("startButtonVisible") ? View.VISIBLE : View.INVISIBLE);
    buttonStop.setVisibility(savedInstanceState.getBoolean("stopButtonVisible") ? View.VISIBLE : View.INVISIBLE);
    buttonReset.setVisibility(savedInstanceState.getBoolean("resetButtonVisible") ? View.VISIBLE : View.INVISIBLE);
    buttonSave.setVisibility(savedInstanceState.getBoolean("saveButtonVisible") ? View.VISIBLE : View.INVISIBLE);
    buttonOpenLatestFile.setVisibility(savedInstanceState.getBoolean("openLatestFileButtonVisible") ? View.VISIBLE : View.INVISIBLE);

    editTextStartValue.setEnabled(savedInstanceState.getBoolean("editTextStartValueVisible"));
    buttonStartValueDown.setEnabled(savedInstanceState.getBoolean("buttonStartValueDownVisible"));
    buttonStartValueDown.setImageResource(buttonStartValueDown.isEnabled() ? R.drawable.ic_arrow_down : R.drawable.ic_arrow_down_gray);
    buttonStartValueUp.setEnabled(savedInstanceState.getBoolean("buttonStartValueUpVisible"));
    buttonStartValueUp.setImageResource(buttonStartValueUp.isEnabled() ? R.drawable.ic_arrow_up : R.drawable.ic_arrow_up_gray);
    editTextEndValue.setEnabled(savedInstanceState.getBoolean("editTextEndValueVisible"));
    buttonEndValueDown.setEnabled(savedInstanceState.getBoolean("buttonEndValueDownVisible"));
    buttonEndValueDown.setImageResource(buttonEndValueDown.isEnabled() ? R.drawable.ic_arrow_down : R.drawable.ic_arrow_down_gray);
    buttonEndValueUp.setEnabled(savedInstanceState.getBoolean("buttonEndValueUpVisible"));
    buttonEndValueUp.setImageResource(buttonEndValueUp.isEnabled() ? R.drawable.ic_arrow_up : R.drawable.ic_arrow_up_gray);

    Log.e("Fragment", "Restored view visibility");
}

为什么在调用onViewStateRestored()时数据不正确?无论以前是什么,所有的观点都变得无形 . 保存和恢复状态时捆绑包不一样吗?

但是,在调用 fragmentManager.beginTransaction().replace(R.id.content_frame, CustomFragmentManager.savedFilesFragment).commit(); 然后手动调用onViewStateRestored()时,所有这些代码都可以正常工作 .

EDIT: 更改了字段名称 .

Solution: 我已将 outState = new Bundle(getSavedInstanceState()); 替换为 outState.putAll(getSavedInstanceState()); ,现在正在使用 . 不需要调用 setRetainInstance(true); .

2 回答

  • 0

    我怀疑它与您的方法签名有关 . 你为什么用 static ?静态方法无法访问实例成员 . 这个:

    public static Bundle getSavedInstanceState()
    public static void restoreInstanceState(Bundle savedInstanceState)
    

    应该:

    public Bundle getSavedInstanceState()
    public void restoreInstanceState(Bundle savedInstanceState)
    

    其次,你的字段名称非常类似于Java . 这个:

    BTN_startValueDown
    

    应该(例如):

    btnStartValueDown
    

    First edit

    应该早点想到这个 . 由于您只是想保留片段的状态,只需在片段的 onCreate() 中调用 setRetainInstance(true) 即可 . 见here .

    Second edit

    另一个回答者是对的:你不应该为out-state创建另一个Bundle . 如果您真的想在单独的方法中创建该Bundle,请改用:

    outState.putAll(getSavedInstanceState());
    
  • 2

    您不应该自己手动创建状态包,使用已在方法onSaveInstanceState()中传递的outState对象并在onCreate()方法中恢复 . 另外,你在你的片段的onCreate()中调用setRetainInstance(true) .

相关问题