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方法.我认为如果你的活动更复杂,你可能想要使用后一种方法明确定义任何状态变化.
所以我认为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,设置progressBarIsShowing为true.当你解雇时切换它progressBar.
覆盖onSaveInstanceState(Bundle):
if (progressBarIsShowing) {
outState.putBoolean("progressBarIsShowing", progressBarIsShowing);
}
Run Code Online (Sandbox Code Playgroud)
注意:检查用户何时浏览您的活动(通过按下主页按钮等).当用户这样做时,您可能会看到BadTokenExceptionif progressBar.
| 归档时间: |
|
| 查看次数: |
4105 次 |
| 最近记录: |