0%

Android表单处理

Android技术沉淀

表单处理

表单的处理在项目中会经常遇到,在我们POC项目中,也会涉及到处理用户信息的显示与更新,如图 5-1 所示。由于获取用户信息是异步操作,需要调用API,若此时用户在输入框中输入信息,当获取用户信

息的API访问完成,用户输入的信息就会被覆盖掉。为了防止此类问题出现,我们的解决方案是:在调用完获取用户信息API后,再显示表单,让用户可以进行更新信息的操作。若获取用户信息API调用失败,将会跳到Error界面。图 5 -1 表单的数据处理上,还会涉及到数据的双向绑定,及表单字段对应的数据模型会改变界面上显示的数据,界面上用户的输入会改变相应的数据模型。项目中使用到了Android自带的数据绑定库(databinding),可以通过两种方式实现数据模型与界面数据的状态更新:

方法1:

单向数据绑定+组件监听器: 在相应xml文件里的view加入单向数据绑定标识符号@以及数据名
称,再在为输入框设置监听,来改变相应的数据模型。(如下图所示)

1
2
3
4
<com.google.android.material.textfield.TextInputEditText
android*:id="@+id/profile_edit_about_me_input"
android:text="@{userProfile.aboutMe}"
/>

添加监听器

1
2
3
binding.profileEditAboutMeInput.addTextChangedListener {
profileViewModel.userProfile.value.aboutMe = it.toString()
}

方法2:

双向数据绑定:在相应xml文件里的view加入双向数据绑定标识符@=以及数据名称,再为需要绑定的字段加上bindable修饰器(编译时,会自动生成相应字段的BR),配合notifyPropertyChanged即可完成双向绑定 , 从而省去View层监听及setText调用的逻辑代码。

1
2
3
4
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/profile_edit_about_me_input"
android:text="@={userProfile.aboutMe}"
/>
1
2
3
4
5
6
7
class UserProfile( aboutMe: String?) : BaseObservable() {
@get:Bindable var aboutMe: String? = ""
set(value) {
field = value notifyPropertyChanged(BR.aboutMe*)
}

init { this.aboutMe = aboutMe }}

由于项目中将表单字段封装到UserProfile类中,涉及到类中字段的自定义getter/setter,示例代码中方法2会比方法2多几行代码。但是如果涉及多个view内input feild对同一个字段的绑定,方法一则需要添加更多的监听器,而方法二只需要使用“@=”绑定上相应数据字段,即可实现自动同步view与数据模型。这样可以简化view层与数据模型同步的测试,挺高了可维护性。