我有一个订阅表:姓名,地址,本地等,等等,并且我希望能够使用Data Binding
,LiveData
和SavedStateHandle
来处理和保留数据。
我们假设:Data Binding
,LiveData
和SavedStateHandle
的一种方式
private val _name: MutableLiveData<Boolean> = stateHandle.getLiveData("_name", "")
val name: LiveData<String> = _name
fun onNameChanged(editable: Editable) {
_name.value = editable.toString()
}
<EditText
android:text="@{viewModel.name}"
android:afterTextChanged="@{viewModel::onNameChanged}"
...
/>
这可行,但我认为我们可以做得更好:
@Parcelize class Form
封装所有字段2-way Data Binding
以减少.xml
代码现在问题开始出现。
如何通知Form class
内部的更改,以便能够将object
与SavedState
保持一致?尝试改进上面的代码或使用2-way Data Binding
失去控制,实际上是否有优势?我还使用一些逻辑来启用提交按钮,如下所示:
private val _name: MutableLiveData<String> = stateHandle.getLiveData("_name", "")
val name = _name.map { value -> {
updateUi()
return value}
}
private val _formValidLiveData = MutableLiveData<Unit>()
val submitEnable = _formValidLiveData.map { _ -> isFormValid() }
val submitAlpha = _formValidLiveData.map { _ -> if (isFormValid()) 1f else 0.5f }
...
private fun updateUi() {
_formValidLiveData.value = Unit
}
再次使用2-way Data Binding
失去控制权,当updateUi()
字段更改时如何调用EditText
?
感谢您的宝贵时间。
答案 0 :(得分:0)
好吧,也遇到了类似的问题-并对此进行了测试,看来效果很好:
public class LoginViewModel extends AndroidViewModel {
public final MutableLiveData<String> mUsername;
private SavedStateHandle handle;
public LoginViewModel(Application application, SavedStateHandle handle) {
// If this is the first time entering the activity, mUsername will be created, populated by value 'BLAH' and stored in the handler.
// else, this will will be the last set value
mUsername = handle.getLiveData("mUsername", "BLAH");
}
}
现在,我在2向绑定用户名字段中输入了一些值,如xml中这样定义:
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/username_wrapper"
android:layout_below="@id/header_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/general_padding"
android:theme="@style/TextInputLayoutAppearance"
android:hint="@string/username">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/username_field"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textEmailAddress"
android:text="@={ viewModel.mUsername }"/>
</com.google.android.material.textfield.TextInputLayout>
为了进行测试,我在该字段中输入了一些数据,并按照下面的链接回答。每次将字段设置为“最新输入”值。为了确保这一点,我还在我的视图模型的构造函数中添加了一个断点-您可以看到该值已正确填充!因此,似乎两种方式的数据绑定都可以正常工作。
链接触发活动/视图模型销毁,导航至:Android viewModel savedStateHandle