Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 碎片在分离/销毁/方向更改时保持视图状态_Android_Android Fragments_Android Actionbar_Android View - Fatal编程技术网

Android 碎片在分离/销毁/方向更改时保持视图状态

Android 碎片在分离/销毁/方向更改时保持视图状态,android,android-fragments,android-actionbar,android-view,Android,Android Fragments,Android Actionbar,Android View,我有一个应用程序,它有两个片段作为actionbar选项卡。在选项卡之间切换时,会附着/分离片段。每当我切换选项卡、更改方向或按back退出应用程序时,视图都会被破坏。我需要它重新打开时恢复到以前的状态。我知道,至少在方向更改时,要使用onSaveInstanceState并将数据保存在那里,以便在重新创建视图时恢复数据。但是,由于某些原因,即使数据正确保存到outState捆绑包中,并且从savedInstanceState捆绑包中正确读取,视图也不会更新到它应该更新的位置。例如,我启动一个服

我有一个应用程序,它有两个片段作为actionbar选项卡。在选项卡之间切换时,会附着/分离片段。每当我切换选项卡、更改方向或按back退出应用程序时,视图都会被破坏。我需要它重新打开时恢复到以前的状态。我知道,至少在方向更改时,要使用onSaveInstanceState并将数据保存在那里,以便在重新创建视图时恢复数据。但是,由于某些原因,即使数据正确保存到outState捆绑包中,并且从savedInstanceState捆绑包中正确读取,视图也不会更新到它应该更新的位置。例如,我启动一个服务,当该服务运行时,我需要隐藏两个按钮,并在其位置显示另外两个按钮。我使用一个布尔值来检查服务是否正在运行,然后将其放在outState中,这样我就可以看到要显示或隐藏的按钮。我的代码是:

@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上遇到了问题。