我有一个片段,其中包含许多EditTexts。 当我旋转设备时,EditText变为空白。片段未保存其状态/值。但同时如果我将该片段布局用于活动,它会存储EditText的状态。 是的,我已经为每个EditText提供了ID,如果重要的话,甚至是每个视图。
我知道我可以使用saveInstanceState来保存这些值,但还有其他方法吗?因为该片段中有近20个EdiText,所以我应该使用saveInstanceState,是否可以在saveInstanceState中保存这些变量/值?
的更新 我在方向更改的活动中重新创建了片段,因此这就是EditText无法保存其状态的原因。 这么傻的错! 所以现在我只使用了saveInstanceState,如下所示:
if (savedInstanceState == null) {
initialiseNewTaskFragment();
}
就是这样。 EditText现在正在保存其状态。 谢谢JorgeGil节省我的时间!
答案 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