为什么不能在方向更改时默认保存EditText状态?

时间:2017-12-01 19:32:46

标签: android android-fragments android-edittext onsaveinstancestate

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

这是一个相当负载的问题大声笑。 所以,让我们从几点开始。

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

android:configChanges="orientation"

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

是的,当然,当嵌套在Activities中时,你可以做fragment.retainInstance以使其保留值。但是,保留已填充元素的值并不是因为UI元素被完全重绘而本来可以期望它做的事情,因此必须告诉它重新绘制它。

所以,如果你要去读书,你实际上仍然在做findViewById和myText.setText(' some Stuff')。然后你可以节省使用像icepick这样的库的时间。

https://github.com/frankiesardo/icepick

然而,一英里的最佳选择是使您的编码实践现代化以使用DataBinding。这使您不再关心UI交互,因为默认情况下值绑定到Fragment或Activity或Model值,并且可以使用双向绑定完成。这样可确保数据绑定始终填充上次更新的值。

想象一下你有一个

的对象
public class Student implements BaseObservable{
     String firstName;
}

然后在你的xml中你有

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

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

这是您最好的解决方案,但取决于您在Android开发的未来绑定技术方面的投资方式,或者您是否更愿意通过现状来达到终点。

希望有所帮助。

答案 1 :(得分:-2)

Activity的{​​{1}}标记中添加此内容,以避免重新设置AndroidManifest.xml,并且不会丢失数据。

Activity