当前位置: 首页 > 知识库问答 >
问题:

Android双向数据绑定只能单向工作

钱均
2023-03-14

我有一个模型

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

我可以从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。用户是LiveData类型,而不是字符串类型。我写过绑定适配器:

@BindingAdapter("android:text")
    fun setLiveDataText(editText: EditText, liveData: LiveData<String>) {
            if(liveData == null){
                editText.setText("")
            } else {
                editText.setText(liveData.value)
            }
        }

但我仍然得到了上述信息。

共有2个答案

关志勇
2023-03-14

这个问题的答案是为了工作,你应该把这个添加到构建中。格雷德尔:

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

kotlin版本应该降级:

ext.kotlin_version = '1.3.41'

干杯

仉英朗
2023-03-14

首先,你需要将用户公开。然后你需要使用“@={viewmodel.\u user}”,这样你就可以得到\u user的值。如果不公开数据绑定变量,数据绑定API就无法找出并生成代码。对于字符串这样的简单字段,这种方法就足够了,但对于更复杂的情况,您可能必须实现BindingAdapters。有关示例,请参阅本文。

 类似资料:
  • 1. 前言 本小节我们将介绍 Vue 中数据的双向绑定指令 v-model。v-model 的学习相对简单 我们可以用 v-model 指令在表单 、 及 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。 2. 慕课解释 用 v-model 指令在表单 、 及 元素上创建双向数据绑定。它会根据控件类型自动选

  • 出于好奇和增加知识,我想在dom元素和javascript变量之间实现某种双向数据绑定。 我很幸运,在这里@stackoverflow找到了一个很好的答案,解决了我一半的问题,这就引出了这个要点https://gist.github.com/384583,但我仍然无法100%完成这件事。 下面是我的代码示例:http://jsfiddle.net/bpH6Z/ 如果您尝试运行fiddle并单击“查

  • 问题内容: 我对这些概念有些模糊,如果我完全在AngularJS和ReactJS中构建相同的ToDo应用程序,那么,什么使React ToDo使用单向数据绑定而不是AngularJS的双向数据绑定? 我了解React之类的作品 渲染(数据)—> UI。 这与Angular有何不同? 问题答案: 角度的 当角度设置数据绑定时,存在两个“观察者”(这是一种简化) 输入将以开始,然后更新为1000ms。

  • Mpx针对表单组件提供了wx:model双向绑定指令,类似于v-model,该指令是一个语法糖指令,监听了组件抛出的输入事件并对绑定的数据进行更新,默认情况下会监听表单组件的input事件,并将event.detail.value中的数据更新到组件的value属性上。 简单实用示例如下: <view> <input type="text" wx:model="{{message}}"> <

  • 双向绑定这个概念在angular出现的时候,就作为王牌概念. 现在几乎是个js前端框架,就有这个功能. 它的概念是: 某个变量, 如果展现在页面上的话: 如果在代码层面进行修改, 那么页面的值就会发生变化 如果在页面进行修改(例如在input标签中), 那么代码的值就会发生变化. 一个演示例子. 在我们的项目中,增加一个 vue页面: src/components/TwoWayBinding.vu

  • 单向绑定非常简单,就是把Model绑定到View,当我们用JavaScript代码更新Model时,View就会自动更新。 有单向绑定,就有双向绑定。如果用户更新了View,Model的数据也自动被更新了,这种情况就是双向绑定。 什么情况下用户可以更新View呢?填写表单就是一个最直接的例子。当用户填写表单时,View的状态就被更新了,如果此时MVVM框架可以自动更新Model的状态,那就相当于我