在Android中保存状态无效

时间:2016-04-21 09:49:11

标签: android android-fragments savestate

我有一个包含片段的活动。该片段有一个进度条和一个文本视图,以及其他一些东西。进度条和文本视图有时是可见的,在其他时间不可见,具体取决于某些应用程序逻辑。

我要做的是在旋转屏幕时保存这两个视图的当前状态。这是我片段中的相关代码 -

@Override
public void onSaveInstanceState(Bundle outState) {

    // pbTranscribe is my progress bar

    if (pbTranscribe != null) {
        Log.d(TAG, "saving pb visibility");
        boolean visibility = (pbTranscribe.getVisibility() == ProgressBar.VISIBLE);
        outState.putBoolean("pbVisible", visibility);
    }
}

@Override
public void onViewStateRestored(Bundle savedInstanceState) {
    super.onViewStateRestored(savedInstanceState);

    if (savedInstanceState != null) {
        Log.d(TAG, "bundle available !!");

        boolean pbVisible = savedInstanceState.getBoolean("pbVisible", false);
        Log.d(TAG, "is visible? " + pbVisible);
        if (pbVisible) {
            pbTranscribe.setVisibility(ProgressBar.VISIBLE);
        }
    }
}

由于某种原因,上述代码似乎不起作用。如果我在进度条可见时旋转我的屏幕,logcat会打印上述所有消息(“保存pb可见性”,“捆绑可用!!”,“可见?真”)。我知道我的应用程序逻辑在这段时间内没有将可见性设置为不可见。

即使从包中获得的值为true,进度条也不会显示,即pbTranscribe.setVisibility(ProgressBar.VISIBLE);显然没有完成其工作。

我哪里错了?如何成功维护进度条状态?

我还尝试在onCreateView()onActivityCreated()中恢复状态,结果相同。此外,我尝试以类似的方式保存文本视图状态,但也提供相同的结果。使用android:freezesText="true"保存文本视图状态也无法解决问题。

编辑:这就是我在活动的onCreate()方法中将片段添加到活动的方式 -

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    getSupportFragmentManager().beginTransaction()
            .replace(R.id.fragments_frame, new WatsonFragment())
            .commit();
    ...
}

1 个答案:

答案 0 :(得分:2)

当屏幕旋转时,Activity将调用onCreate并创建另一个WatsonFragment,将代码修改为此

if(savedInstanceState==null){
getSupportFragmentManager().beginTransaction()
        .replace(R.id.fragments_frame, new WatsonFragment())
        .commit();
}