0

我有视图模型:

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)
            }
        }

但我仍然收到上述消息。

4

2 回答 2

2

首先,你需要_user公开。然后你需要使用"@={viewmodel._user}",这样你才能得到 的值_user。如果您不公开数据绑定变量,则数据绑定 API 无法计算并生成代码。对于字符串等简单字段,这种方法就足够了,但您可能必须BindingAdapters针对更复杂的情况实施。有关示例,请参阅本文

于 2019-09-29T23:03:31.990 回答
0

为了工作,这个问题的答案应该添加到 build.gradle:

implementation "android.arch.lifecycle:extensions:1.1.1"

并且 kotlin 版本应该降级:

ext.kotlin_version = '1.3.41'

干杯!

于 2019-09-30T19:22:12.160 回答