gpt4 book ai didi

java - get SavedInstanceState() 和 onViewStateRestored() bundle 的问题

转载 作者:行者123 更新时间:2023-12-02 04:00:46 25 4
gpt4 key购买 nike

我的 Activity 中有一个 Fragment,当设备旋转时,会调用 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(),这应该是恢复每个 View 的状态。

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()时数据不正确?所有 View 都变得不可见,无论它们之前是什么。保存和恢复状态时的包是否不一样?

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

编辑:更改了字段名称。

解决方案:我已替换 outState = new Bundle(getSavedInstanceState());outState.putAll(getSavedInstanceState());现在它正在发挥作用。调用setRetainInstance(true);没有必要。

最佳答案

您不应该使用已传入 onSaveInstanceState() 方法并在 onCreate() 方法中恢复的 outState 对象自行手动创建状态包。另外,您应该在 fragment 的 onCreate() 中调用 setRetainInstance(true)。

关于java - get SavedInstanceState() 和 onViewStateRestored() bundle 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34939335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com