我有视图模型:
class MyViewModel : ViewModel(){
private val _user = MutableLiveData("")
val user: LiveData<String> = _user
fun onBtnClick(){
Log.i("MyViewModel", "user: ${_user.value}")
}
}
我使用以下方法将它与片段布局连接起来:
<data>
<variable
name="viewmodel"
type="com.pkg.pkg.pkg.fragments.concretePkg.MyViewModel" />
</data>
<EditText
...
android:text="@={viewmodel.user}"
android:hint="User" />
在 onCreateView 方法的片段类中:
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_my_fragment, container, false)
binding.lifecycleOwner = this
// bind viewModel
viewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
binding.viewmodel = viewModel
// Inflate the layout for this fragment
return binding.root
我可以EditText
从片段或 ViewModel 类中更改值,但是当我尝试onBtnClick
在 Logcat 中的 ViewModel 方法中获取值时,我收到消息:I/MyViewModel: user:
我在这里缺少什么,以便双向数据绑定从其他方向呢?简而言之,数据从界面上的 ViewModel/ Fragment 流向 EditText,但它不会从界面上的 EditText 流向 ViewModel 字段/方法。提前致谢。
------- EDITED ----- 我设法填充了所有内容,但知道我收到了这个错误:
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 类型而不是 String 类型。我写了绑定适配器:
@BindingAdapter("android:text")
fun setLiveDataText(editText: EditText, liveData: LiveData<String>) {
if(liveData == null){
editText.setText("")
} else {
editText.setText(liveData.value)
}
}
但我仍然收到上述消息。