Android 中的保存状态不起作用
Saving state in Android not working
我有一个 activity,其中包含一个片段。该片段有一个进度条和一个文本视图,以及其他一些东西。进度条和文本视图有时可见,有时不可见,具体取决于某些应用程序逻辑。
我想做的是在屏幕旋转时保存这两个视图的当前状态。这是我片段中的相关代码 -
@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 会打印上述所有消息("saving pb visibility"、"bundle available !!"、"is visible? true")。我知道我的应用程序逻辑在此期间没有将可见性设置为不可见。
即使从 bundle 中获取的值为 true,进度条也不会显示,即 pbTranscribe.setVisibility(ProgressBar.VISIBLE);
显然没有完成它的工作。
我哪里错了?如何成功保持进度条状态?
我也试过恢复onCreateView()
和onActivityCreated()
的状态,结果一样。此外,我尝试以类似的方式保存文本视图状态,但结果也相同。使用 android:freezesText="true"
保存文本视图状态也没有成功。
编辑:这就是我在 activity 的 onCreate()
方法中将片段添加到 activity 的方式 -
@Override
protected void onCreate(Bundle savedInstanceState) {
...
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragments_frame, new WatsonFragment())
.commit();
...
}
当屏幕旋转时,Activity 将调用 onCreate 并创建另一个 WatsonFragment,将您的代码修改为此
if(savedInstanceState==null){
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragments_frame, new WatsonFragment())
.commit();
}
我有一个 activity,其中包含一个片段。该片段有一个进度条和一个文本视图,以及其他一些东西。进度条和文本视图有时可见,有时不可见,具体取决于某些应用程序逻辑。
我想做的是在屏幕旋转时保存这两个视图的当前状态。这是我片段中的相关代码 -
@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 会打印上述所有消息("saving pb visibility"、"bundle available !!"、"is visible? true")。我知道我的应用程序逻辑在此期间没有将可见性设置为不可见。
即使从 bundle 中获取的值为 true,进度条也不会显示,即 pbTranscribe.setVisibility(ProgressBar.VISIBLE);
显然没有完成它的工作。
我哪里错了?如何成功保持进度条状态?
我也试过恢复onCreateView()
和onActivityCreated()
的状态,结果一样。此外,我尝试以类似的方式保存文本视图状态,但结果也相同。使用 android:freezesText="true"
保存文本视图状态也没有成功。
编辑:这就是我在 activity 的 onCreate()
方法中将片段添加到 activity 的方式 -
@Override
protected void onCreate(Bundle savedInstanceState) {
...
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragments_frame, new WatsonFragment())
.commit();
...
}
当屏幕旋转时,Activity 将调用 onCreate 并创建另一个 WatsonFragment,将您的代码修改为此
if(savedInstanceState==null){
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragments_frame, new WatsonFragment())
.commit();
}