我正在创建一个应用程序,这是一个专门的计时器。我展示了一个倒计时计时器,在倒计时期间做了一些其他的事情。有了MVVM的背景,我想在这个项目中使用新的Android绑定框架。我设置了我的视图,如下所示:
<data>
<variable
name="viewModel"
type="com.examples.viewmodels.MainActivityVM"/>
</data>
用TextView显示倒计时
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="@{viewModel.timeLeftText}"
android:textAlignment="center"
android:textSize="144dp"/>
和类的活动,我已经设置绑定在onCreate覆盖:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setViewModel(this.viewModel);
}
一切都像宣传的那样。我可以点击视图上的一个按钮,开始我的倒计时。我编写的业务逻辑类处理在剩余时间内更新视图模型实例,并按照我的期望更新视图。太棒了!
然而,我遇到了一个问题,如果设备从纵向旋转到横向,视图完全失去了与视图模型的连接。奇怪的是,它会回到默认的启动状态,就好像应用程序第一次启动一样。
我想到有一种情况下,应用程序可以暂停,然后根据更改恢复。我在谷歌上验证了这一点,发现一个应用程序可以在方向改变时暂停和恢复。我将清单中的活动更改为:
<activity
android:name=".MainActivity"
android:configChanges="orientation"
android:label="@string/app_name">
...
</activity>
这没有帮助。我错过了什么?(可能很多!)
首先,当Android activity的方向改变时,它总是被销毁并重新创建。用你的话说,What's odd is that it goes back to its default start state as if the app has just started for the first time
。这没什么奇怪的,事实上这里已经讲得很清楚了。
如果你想让Android系统不重新创建活动,你可以使用
android:configChanges="orientation|screenSize"
你的代码不工作的原因可能是因为你的目标是API级别13+,正如这里提到的。
从Android 3.2 (API level 13)开始,"屏幕尺寸"也当设备在纵向和横向之间切换时更改取向。因此,如果您希望防止运行时重新启动,由于当为API级别13或更高的版本开发时,方向会发生变化由minSdkVersion和targetSdkVersion属性声明),您可以除了"方向"外,还必须包含"屏幕大小"值。价值。也就是说,你必须申报面向android: configChanges = " |拉"。然而,如果你应用程序的目标API级别为12或更低,那么您的活动总是处理此配置更改本身(此配置更改)不重新启动您的活动,即使运行在Android 3.2或更高的设备)。