0

我有一个片段,其中包含许多 EditText。当我旋转设备时,EditText 变为空白。片段未保存其状态/值。但同时,如果我将该片段布局用于活动,它会存储 EditText 的状态。是的,我已经为每个 EditText 提供了 ID,如果重要的话,甚至是每个视图。

我知道我可以使用 saveInstanceState 来保存这些值,但是还有其他方法吗?因为该片段中几乎有 20 个 EdiText,所以我应该使用 saveInstanceState,将这么多变量/值保存在 saveInstanceState 中可以吗?

更新: 我在改变方向的活动中重新创建片段,所以这就是 EditText 无法保存其状态的原因。如此愚蠢的错误!所以现在我只使用了 saveInstanceState ,如下所示:

if (savedInstanceState == null) {
        initialiseNewTaskFragment();
    }

就是这样。EditText 现在正在保存它的状态。感谢 JorgeGil 节省了我的时间!

4

2 回答 2

1

好吧,这是一个相当负荷的问题,哈哈。所以让我们从几点开始。

首先,如果您选择不允许 Android 在设备旋转时重置您的生命周期,您当然可以处理自己的生命周期更改。

android:configChanges="orientation"

如果您想保留所有内容并处理您自己的轮换更改,请在清单中使用该标志。但是,如果您有一个包含不同 XML 文件的 layout-land 文件夹,您将不希望这样做。

是的,当然您可以在嵌套在活动中时执行 fragment.retainInstance 以使其保留值。然而,保留填充元素的值并不是你可以期望它做的事情,因为 UI 元素被完全重绘,所以必须告诉它再次重绘它。

因此,如果您要上老学校并且实际上仍在执行 findViewById 和 myText.setText('some Stuff')。然后,您可能会发现使用 icepick 之类的库可以节省一些时间。

https://github.com/frankiesardo/icepick

但是,最好的选择是将您的编码实践现代化以使用 DataBinding。这使您不再关心 UI 交互,因为这些值默认绑定到您的 Fragment 或 Activity 或 Model 值,并且可以通过 2-way binding 完成。这可确保数据绑定始终填充上次更新的值。

想象你有一个对象

public class Student implements BaseObservable{
     String firstName;
}

然后在你的xml中你有

editText
    android:text="@={student.firstName}"

显然还有一点,比如你需要在 onCreate 中设置你的学生对象,以确保它在 XML 中以供使用。但是当用户修改学生名字时,它会保留在模型中,并自动重绘到编辑文本中。

这是您最好的解决方案,但取决于您对 Android 开发的未来绑定技术的投入程度,或者您是否更愿意保持现状以越过终点线。

希望有帮助。

于 2017-12-01T19:41:13.873 回答
-2

将此添加到您的Activity标签中AndroidManifest.xml以避免重新创建,Activity并且您不会丢失数据。

  android:configChanges="orientation|screenSize"
于 2017-12-01T19:38:37.310 回答