使用Android架构组件处理输入

时间:2018-05-01 18:06:46

标签: android mvvm android-architecture-components

TL; DR

如何处理主动更改数据的活动(例如通过EditText)?我是否继续在旋转时将状态保存在SavedInstanceState中,并且只在所有字段都准备就绪时使用ViewModel,或者是否有办法让ViewModel负责检查/保存/使用UI的数据?

问题

我正在使用Google的Arch开发我的应用程序。组件和编写我的最新课程我注意到我不太确定在处理来自活动表单的数据时最佳实践是什么。

实施例

我有一个由标题,描述,位置,类型

组成的POJO

我有一个包含四个EditText的活动:title_etdescription_etlocation_ettype_et

我的ViewModel,通过存储库(此处不相关),可以在调用sendObject函数时将对象发送到数据库。

我现在怎么做

活动包含mTitlemDescriptionmLocationmType。 在轮换时,活动会保存savedInstanceState包中的所有EditText值,并再次加载它们以填充视图。

当用户想要发送对象时,它会点击一个按钮,活动会在必要的检查后调用函数viewModel.sendObject(mTitle, mDescription, mLocation, mType)

此方法的问题

活动负责保存/检查EditTexts的所有数据,基本上使ViewModel只负责与存储库交互。

我想要完成的事情

理想情况下,我想让Activity只负责UI,将所有内容委托给ViewModel。

这样我就可以调用sendObject(),ViewModel就已经拥有了所有需要的数据。

LiveData情况

现在,ViewModel只有一个LiveData实例,里面有一个资源(taken from here),它用于“告诉”活动新数据已经到达或发生错误。

此方法适用于仅从网络接收数据并显示它们的所有活动。当我想同步来自活动的数据时,我该怎么办?我是否为每个字段使用一个LiveData并使用它来显示潜在的错误?

我已阅读大部分samples但所有活动都是被动的。

结论

感谢任何花时间提供帮助的人。

2 个答案:

答案 0 :(得分:0)

您可以将逻辑分离为模型字符串类,而另一个包含编辑文本字段的所有字符串值的类只是在类的顶部分配字符串值。

答案 1 :(得分:0)

您可以在ViewModel中拥有模型的LiveData,并从View(Activity / UI)中更改它。缺点是要更新LiveData,您需要复制整个模型,编辑它并将其发布回实时数据。

第二种方法是将ViewModel中的Model组件分解为单个参数LiveDatas。稍后在提交表单时,您可以重建模型。

您可以为本机字段执行的操作是使用数据绑定。对于其他人,您需要从具有侦听器等的View手动更新LiveData。