Android双向数据绑定仅以一种方式工作

时间:2019-09-29 22:22:36

标签: android kotlin data-binding mutablelivedata android-components

我有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方法中获取该值时,我得到的消息是:{{ 1}} 我在这里缺少什么,以便双向数据绑定也可以从另一个方向进行? 简而言之,数据从ViewModel / Fragment到接口上的EditText,但不会从接口上的EditText到ViewModel字段/方法。 预先感谢。

-------编辑----- 我设法填充了所有内容,但知道我收到此错误:

I/MyViewModel: user:

我想那是因为viewmodel.user是LiveData类型而不是String。我已经编写了绑定适配器:

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

但是我仍然收到上述消息。

2 个答案:

答案 0 :(得分:0)

首先,您需要公开_user。然后,您需要使用"@={viewmodel._user}",以便获得_user的值。如果您不公开数据绑定变量,则数据绑定API无法确定并生成代码。对于诸如String之类的简单字段,此方法就足够了,但是对于更复杂的情况,您可能必须实现BindingAdapters。有关示例,请参见this文章。

答案 1 :(得分:0)

要解决此问题,您应该将其添加到build.gradle中。

"%WIX%bin\candle.exe" product.wxs -ext WixUIExtension >> Build.log
"%WIX%bin\light.exe" -out Test.msi product.wixobj -ext WixUIExtension >> Build.log

kotlin版本应降级:

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

干杯!