Android 碎片在分离/销毁/方向更改时保持视图状态
我有一个应用程序,它有两个片段作为actionbar选项卡。在选项卡之间切换时,会附着/分离片段。每当我切换选项卡、更改方向或按back退出应用程序时,视图都会被破坏。我需要它重新打开时恢复到以前的状态。我知道,至少在方向更改时,要使用onSaveInstanceState并将数据保存在那里,以便在重新创建视图时恢复数据。但是,由于某些原因,即使数据正确保存到outState捆绑包中,并且从savedInstanceState捆绑包中正确读取,视图也不会更新到它应该更新的位置。例如,我启动一个服务,当该服务运行时,我需要隐藏两个按钮,并在其位置显示另外两个按钮。我使用一个布尔值来检查服务是否正在运行,然后将其放在outState中,这样我就可以看到要显示或隐藏的按钮。我的代码是:Android 碎片在分离/销毁/方向更改时保持视图状态,android,android-fragments,android-actionbar,android-view,Android,Android Fragments,Android Actionbar,Android View,我有一个应用程序,它有两个片段作为actionbar选项卡。在选项卡之间切换时,会附着/分离片段。每当我切换选项卡、更改方向或按back退出应用程序时,视图都会被破坏。我需要它重新打开时恢复到以前的状态。我知道,至少在方向更改时,要使用onSaveInstanceState并将数据保存在那里,以便在重新创建视图时恢复数据。但是,由于某些原因,即使数据正确保存到outState捆绑包中,并且从savedInstanceState捆绑包中正确读取,视图也不会更新到它应该更新的位置。例如,我启动一个服
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean("isRunning", isRunning);
}
在onCreateView中:
if (savedInstanceState != null) {
isRunning = savedInstanceState.getBoolean("isRunning", false);
if (isRunning) {
showStopButton();
}
}
showStopButton代码为:
private void showStopButton() {
btnStart.setVisibility(View.GONE);
btnReset.setVisibility(View.GONE);
btnStop.setVisibility(View.VISIBLE);
btnLoop.setVisibility(View.VISIBLE);
}
因此,所有这些都有效,当服务运行时,布尔值被发现为true,并调用showStopButton()。然而,它似乎并没有实际起到任何作用。视图状态只是将其自身重置为好像显示了前两个按钮(我希望隐藏),而不是我实际希望显示的按钮。知道为什么会发生这种情况/如何解决它吗
我还有一个listview,我需要使用与以前相同的值来填充它,这样我也无法工作
此外,在切换选项卡时不会调用onSaveInstanceState(我想在按下后退按钮时也不会调用)。在这些情况下,我应该如何保持视图状态 您确定showButton()正在运行吗?我这样问是因为它不应该,因为当你保存它时,你将布尔值阶段化为“stopwatchRunning”,当你恢复时,你正在寻找“isRunning”,它将默认为false,因为它的名称不同。哦,哇,那是旧代码。我改变了它,所以它们是相同的变量。showStopButton()肯定正在被调用。它会遍历它并设置所有内容的可见性,但由于某些原因,它实际上无法在应用程序中正确显示。请尝试从
onStart()
触发它。或者设置setRetainInstance(true)
I修复了按钮的问题。显然我必须在savedInstanceState检查之外调用showStopButton()?我不明白为什么我需要这样做,但现在它起作用了。但是我在listview上遇到了问题。