使用Android架构组件处理输入

7

TL;DR

如何处理主动更改数据的Activity(例如通过EditText)?在旋转时,我是否应该在SavedInstanceState中保存它们的状态,并且只有在所有字段准备就绪时才使用ViewModel,或者是否有一种方法使ViewModel负责检查/保持/使用UI的数据?

问题

我正在使用谷歌的Arch.组件开发我的应用程序,在编写最新的类时,我注意到我不太确定处理来自Activity表单的数据的最佳实践是什么。

示例

我有一个由标题、描述、位置、类型组成的POJO。

我有一个具有四个EditText的Activity:title_etdescription_etlocation_ettype_et

我的ViewModel可以通过Repository(此处无关)在调用sendObject函数时向数据库发送对象。

我现在的做法

Activity拥有mTitlemDescriptionmLocationmType。 在旋转时,Activity会将所有EditText值保存在savedInstanceState bundle中,并重新加载它们以填充视图。

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

这种方法存在的问题

Activity负责保存/检查EditText的所有数据,基本上使ViewModel只负责与Repository交互。

我想要实现的目标

理想情况下,我希望将Activity仅限于UI,将一切委托给ViewModel。

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

LiveData的情况

现在,ViewModel只有一个LiveData实例,在其中有一个Resource(取自此处),用于“告诉”Activity新数据已到达或发生错误。

这种方法在所有仅从网络接收数据并显示它们的Activity中都有效。当我想同步来自Activity的数据时,我该怎么办?我为每个字段使用一个LiveData,并使用它来显示潜在的错误吗?

我已阅读了大多数示例,但那里的所有Activities都是被动的。

结论

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

2个回答

0

你可以将逻辑分离到一个模型字符串类中,另一个类包含所有编辑文本字段的字符串值,或者只需在类顶部分配字符串值。


很抱歉,我不确定我完全理解您的信息。您是否有一个GitHub项目可以作为参考?我明白我可以使用一个模型类来保存所有字符串,从而只有一个LiveData(这是个好主意!),但是当您说“只需在类顶部分配String值”时,您是否意味着我应该将它们分配给ViewModel的顶部?如果是这样,那么新创建的Model的用途是什么? - Skepsis Dev

0

你可以在ViewModel中拥有一个LiveData,用于存储你的模型,并且可以从View(Activity/UI)中进行修改。缺点是,要更新LiveData,你需要复制整个模型,对其进行编辑并将其重新发布到LiveData。

第二种方法是将模型的组件在ViewModel中分解为单独的参数LiveData。稍后当表单提交时,你可以重构模型。

对于本地字段,你可以使用数据绑定。对于其他字段,你需要手动从View中使用监听器等更新LiveData。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接