通过方向更改维护进度条可见性

Jam*_*s B 2 android bundle android-progressbar

我有一个在xml中定义的进度条(swirly waiting style):

<ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        style="@android:style/Widget.Holo.ProgressBar.Large"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:id="@+id/progress"
        />
Run Code Online (Sandbox Code Playgroud)

我隐藏它在活动onCreate方法中的可见性,使用,

progressBar.setVisibility(View.GONE);
Run Code Online (Sandbox Code Playgroud)

onClick使用按钮的事件启动它

progressBar.setVisibility(View.VISIBLE);
Run Code Online (Sandbox Code Playgroud)

现在,如果我更改屏幕,则进度条会消失.我知道活动在方向更改时被销毁并重新创建,活动的状态将在保存的新方向中重新创建Bundle savedInstanceState.所以我认为Bundleandroid保存的默认值不包括对ProgressBarView对象所做的任何更改吗?

如果是这种情况,是否正确地说,在ProgressBar方向改变之后恢复正确可见性的唯一方法是boolean pbState = false/true通过覆盖方法onSaveInstanceState并检查此标志onRestoreInstanceState并相应地设置可见性来保存标志(例如)?或者,我遗漏了一些关于保存视图对象状态的明显信息.

谢谢

更新:

以下提供的解决方案都有效.我决定选择放入android:configChanges="orientation|screenSize"清单xml文件.但是,文档声明此方法应仅用作最后的手段.我的活动相当简单,因此清单xml方法减少了主活动所需的代码量,即没有onRestoreInstanceState方法.我认为如果你的活动更复杂,你可能想要使用后一种方法明确定义任何状态变化.

Vik*_*ram 7

所以我认为android保存的默认Bundle不包含对ProgressBar View对象所做的任何更改吗?

你是对的.Android不会保存状态progressBar或任何其他小部件.

[是]正确的说法是在方向更改后恢复ProgressBar的正确可见性的唯一方法是通过重写方法onSaveInstanceState并在onRestoreInstanceState中检查此标志并设置来保存标志(例如boolean pbState = false/true)能见度相应?

绝对.关于onRestoreInstanceState(Bundle):您可以不覆盖此方法.为了证实方向的变化,检查savedInstanceState ==> Bundle passed to onCreate(Bundle)打击null.如果发生了方向更改,savedInstanceState则不会为null.在活动开始时,savedInstanceState将是null.以下代码(基本上是你提出的)应该做的工作:

声明一个全局布尔变量:

boolean progressBarIsShowing;
Run Code Online (Sandbox Code Playgroud)

在你的onCreate(Bundle):

// savedInstanceState != null ===>>> possible orientation change 
if (savedInstanceState != null && savedInstanceState.contains("progressbarIsShowing")) {

    // If `progressBarIsShowing` was stored in bundle, `progressBar` was showing
    progressBar.setVisibility(View.VISIBLE);

} else {

    // Either the activity was just created (not recreated), or `progressBar` wasn't showing
    progressBar.setVisibility(View.GONE);

}
Run Code Online (Sandbox Code Playgroud)

每当你显示progressBar,设置progressBarIsShowingtrue.当你解雇时切换它progressBar.

覆盖onSaveInstanceState(Bundle):

if (progressBarIsShowing) {
    outState.putBoolean("progressBarIsShowing", progressBarIsShowing);
}
Run Code Online (Sandbox Code Playgroud)

注意:检查用户何时浏览您的活动(通过按下主页按钮等).当用户这样做时,您可能会看到BadTokenExceptionif progressBar.