Android数据绑定-视图在旋转时失去绑定



我正在创建一个应用程序,这是一个专门的计时器。我展示了一个倒计时计时器,在倒计时期间做了一些其他的事情。有了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或更高的设备)。

最新更新