使用数据绑定和Kotlin观察Android中的类参数
我有一个模型使用数据绑定和Kotlin观察Android中的类参数,android,kotlin,mvvm,observable,android-databinding,Android,Kotlin,Mvvm,Observable,Android Databinding,我有一个模型 data class RegisterPostDataWithPwdCheck( var phone_number: String?, var name: String?, var password: String?, var secondPassword: String?) 和一个视图模型 class SignUpViewModel(application: Application) : BaseViewModel(application){
data class RegisterPostDataWithPwdCheck(
var phone_number: String?,
var name: String?,
var password: String?,
var secondPassword: String?)
和一个视图模型
class SignUpViewModel(application: Application) : BaseViewModel(application){
val registerPostData = MutableLiveData<RegisterPostDataWithPwdCheck>...
fun checkPassword(){}...}
在XML中有两个感兴趣的字段
<EditText
android:id="@+id/edittext_sign_up_password"
android:text="@={view_model.registerPostData.password}" />
<EditText
android:id="@+id/edittext_sign_up_second_pw"
android:text="@={view_model.registerPostData.secondPassword}" />
到目前为止,我所理解的是,只有当整个
RegisterPostDataWithPwdCheck
对象发生更改时才会调用.observe
,我不希望这样。我希望在任何参数更改时触发它,以便调用fun checkPassword(){}
,查看这两个字段是否匹配。这可能吗 使用@mahdi shahbazi评论,我已经在Kotlin解决了这个问题。我的模型现在是:
data class RegisterPostDataWithPwdCheck(
@SerializedName(value = "phone_number")
private var phoneNumber: String?,
private var name: String?,
private var password: String?,
private var secondPassword: String?
) : BaseObservable() {
@Bindable
fun getPhoneNumber(): String? {
return phoneNumber
}
fun setPhoneNumber(value: String) {
if (value != phoneNumber) {
phoneNumber = value
notifyPropertyChanged(BR.phoneNumber)
}
}
@Bindable
fun getName(): String? {
return name
}
fun setName(value: String?) {
if (value != name) {
name = value
notifyPropertyChanged(BR.name)
}
}
@Bindable
fun getPassword(): String? {
return password
}
fun setPassword(value: String?) {
if (value != password) {
password = value
notifyPropertyChanged(BR.password)
}
}
@Bindable
fun getSecondPassword(): String? {
return secondPassword
}
fun setSecondPassword(value: String?) {
if (value != secondPassword) {
secondPassword = value
notifyPropertyChanged(BR.secondPassword)
}
}
}
以及创建自定义LiveData类:
class PropertyAwareMutableLiveData<T : BaseObservable> : MutableLiveData<T>()
{
private val callback = object : Observable.OnPropertyChangedCallback() {
override fun onPropertyChanged(sender: Observable?, propertyId: Int) {
value = value
}
}
override fun setValue(value: T?) {
super.setValue(value)
value?.addOnPropertyChangedCallback(callback)
}
}
类属性yawaremutablelivedata:MutableLiveData()
{
private val callback=object:Observable.OnPropertyChangedCallback(){
覆盖已更改的属性(发送方:可观察?,属性ID:Int){
价值=价值
}
}
覆盖设置值(值:T?){
super.setValue(值)
值?.addOnPropertyChangedCallback(回调)
}
}
我仍然不知道是否有办法自动化这个@Binding过程,这个过程非常缓慢和枯燥,还需要进行一些更改(将参数转换为private) 选中此项,您也可以在ChangeText listener上使用编辑文本,并检查密码并将其保存,以便使用此链接。
class PropertyAwareMutableLiveData<T : BaseObservable> : MutableLiveData<T>()
{
private val callback = object : Observable.OnPropertyChangedCallback() {
override fun onPropertyChanged(sender: Observable?, propertyId: Int) {
value = value
}
}
override fun setValue(value: T?) {
super.setValue(value)
value?.addOnPropertyChangedCallback(callback)
}
}