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中使用带下划线的确切名称。谢谢,我已经编辑了我的问题,因为它太长,无法在评论中回答。谢谢。只需要放一个=我的生命就被救了。谢谢。找了这么久,我几乎放弃了。