Android双向数据绑定只能单向工作
我有一个模型:Android双向数据绑定只能单向工作,android,kotlin,data-binding,mutablelivedata,android-components,Android,Kotlin,Data Binding,Mutablelivedata,Android Components,我有一个模型: class MyViewModel : ViewModel(){ private val _user = MutableLiveData("") val user: LiveData<String> = _user fun onBtnClick(){ Log.i("MyViewModel", "user: ${_user.value}") } } 我可以从fragment或ViewModel类中更改EditText
class MyViewModel : ViewModel(){
private val _user = MutableLiveData("")
val user: LiveData<String> = _user
fun onBtnClick(){
Log.i("MyViewModel", "user: ${_user.value}")
}
}
我可以从fragment或ViewModel类中更改EditText
值,但是当我尝试在Logcat中的ViewModel的onBtnClick
方法中获取值时,我得到的消息是:I/MyViewModel:user:
我在这里遗漏了什么,这样双向数据绑定也可以从另一个方向工作?
简而言之,数据在界面上从ViewModel/Fragment流向EditText,但它不会从界面上的EditText流向ViewModel字段/方法。
提前谢谢
-------编辑-----
我设法填充了所有内容,但我知道我遇到了以下错误:
Details: There is no inverse for method getValue, you must add an @InverseMethod annotation to the method to indicate which method should be used when using it in two-way binding expressions
我想这是因为viewmodel.user是LiveData类型,而不是字符串类型。我已经编写了绑定适配器:
@BindingAdapter("android:text")
fun setLiveDataText(editText: EditText, liveData: LiveData<String>) {
if(liveData == null){
editText.setText("")
} else {
editText.setText(liveData.value)
}
}
@BindingAdapter(“安卓:文本”)
趣味setLiveDataText(editText:editText,liveData:liveData){
if(liveData==null){
editText.setText(“”)
}否则{
editText.setText(liveData.value)
}
}
但是我仍然收到了上面的信息。首先,您需要将
\u用户
公开。然后需要使用“@={viewmodel.\u user}”
,这样就可以得到\u user
的值。如果不将数据绑定变量公开,则数据绑定API无法找出并生成代码。对于字符串这样的简单字段,这种方法就足够了,但是对于更复杂的情况,您可能必须实现BindingAdapters
。有关示例,请参阅文章。首先,您需要将\u用户
公开。然后需要使用“@={viewmodel.\u user}”
,这样就可以得到\u user
的值。如果不将数据绑定变量公开,则数据绑定API无法找出并生成代码。对于字符串这样的简单字段,这种方法就足够了,但是对于更复杂的情况,您可能必须实现BindingAdapters
。有关示例,请参阅文章。此问题的答案为了工作,您应该将此添加到build.gradle:
implementation "android.arch.lifecycle:extensions:1.1.1"
和kotlin版本应降级:
ext.kotlin_version = '1.3.41'
干杯 这个问题的答案为了有效,您应该将此添加到build.gradle中:
implementation "android.arch.lifecycle:extensions:1.1.1"
和kotlin版本应降级:
ext.kotlin_version = '1.3.41'
干杯 我已经看到了这一点,并将“@=”放进去,但它随后会产生错误:symbol:class FragmentMyFragmentBindingImpl位置:package com.pkg.pkg。databinding@M.Vas,编辑了我的答案,因为您已经在viewmodel中命名了变量
\u user
,所以必须在XML中使用带下划线的确切名称谢谢,我已经编辑了我的问题,因为它太长,无法在评论中回答。谢谢。只需要放一个=我的生命就被救了。谢谢。我已经看到了这一点,并把“@=”放进去,但它随后产生了错误:symbol:class FragmentMyFragmentBindingImpl位置:package com.pkg.pkg。databinding@M.Vas,编辑了我的答案,因为您已经在viewmodel中命名了变量\u user
,您必须在XML中使用带下划线的确切名称。谢谢,我已经编辑了我的问题,因为它太长,无法在评论中回答。谢谢。只需要放一个=我的生命就被救了。谢谢。找了这么久,我几乎放弃了。