【发布时间】:2019-09-29 22:22:36
【问题描述】:
我有 ViewModel:
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
我可以从片段或 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 类型而不是 String 类型。我已经写了绑定适配器:
@BindingAdapter("android:text")
fun setLiveDataText(editText: EditText, liveData: LiveData<String>) {
if(liveData == null){
editText.setText("")
} else {
editText.setText(liveData.value)
}
}
但我仍然收到上述消息。
【问题讨论】:
标签: android kotlin data-binding mutablelivedata android-components