Databinding /BindingAdapter使用问题汇总

目录

1. xml 中引用其它控件数据

2. 无法生成ViewDatabinding 类

2..2  在ViewModel 中,使用了@Bindable 修饰的函数,返回值为非boolean 类型的, 在函数名注意加上get

2.2 引用其它控件数据注意要写完整的getXXx,   如 username.getText() 

2.3   为错误的控件添加了数据绑定

3. Unresolved reference: BR

4. 使用自定义属性时,提示没有找到 setter方法 (BindingAdapter的使用)




MVVM 中,xml 布局文件用到的大部分数据都是由ViewModel 提供, 也可以引用同一个xml 其它控件的数据,

1. xml 中引用其它控件数据

如布局文件: 


    





而函数 LoginViewModel. verify(String username, String password),  需要两个输入的字符串, xml 中使用了两个EditText 的文本。

参考官方文档: https://developer.android.com/topic/libraries/data-binding/expressions

2. 无法生成ViewDatabinding 类

2..2  在ViewModel 中,使用了@Bindable 修饰的函数,返回值为非boolean 类型的, 在函数名注意加上get

boolean 返回值的函数名可以为 isXXXX(),  其它为 getXXX().

2.2 引用其它控件数据注意要写完整的getXXx,   如 username.getText() 

如果写成Koltin 的方式 xxx.text,  则会报以下错误

错误: 找不到符号
import com.example.mvplogindemo.databinding.AcitivityLoginUsingVmBindingImpl;
                                           ^
  符号:   类 AcitivityLoginUsingVmBindingImpl
  位置: 程序包 com.example.mvplogindemo.databinding

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:compileDebugJavaWithJavac'. > android.databinding.tool.util.LoggedErrorException: Found data binding error(s):
  
  [databinding] {"msg":"if getId is called on an expression, it should have an id: password.text","file":"app\\src\\main\\res\\layout\\acitivity_login_using_vm.xml","pos":[]}

猜测可能是由于当前加载布局文件的Activity 是用Java 语言写的,所以生成的AcitivityLoginUsingVmBindingImpl 也是Java, 因此要使用Java 的getText().

2.3   为错误的控件添加了数据绑定

例如: 在Button 中, 引用了为 Image绑定的数据 如string url,  则也会导致无法生成

3. Unresolved reference: BR

添加插件 'kotlin-kapt'  已经 开启 dataBinding

apply plugin: 'kotlin-kapt'

android {
    dataBinding {
        enabled = true
    }
}

然后,Build -> clean project -> make Project,  接着把用到BR.xxx 的地方,先删掉,然后再敲入 RR.  这时会提示你导入哪一个

\app\build\generated\source\kapt\debug\com\example\xxxapp\BR.java

4. 使用自定义属性时,提示没有找到 setter方法 (BindingAdapter的使用)

Cannot find a setter for that accepts parameter type 'com.xxx.xxxinfo'

If a binding adapter provides the setter, check that the adapter is annotated correctly and that the parameter type matches.

1.布局文件(xml) 使用到的自定义属性(如app:xxxinfo),
确定使用了 BindingAdapter 注解声明(如 @BindingAdapter("xxxinfo"), 具体的函数名或者执行的操作则可以随意 ),
则在编译期间可以解释出这个属性

注意:
如何在自定义多个属性而正常使用其中的部分属性呢,
@BindingAdapter 注解还有一个参数 requireAll ,requireAll 默认为 true,表示必须使用全部属性,将其设置为 false 就可以正常使用部分属性
例如: @BindingAdapter(value = {"imageUrl", "placeholder", "error"},requireAll = false)
参考:https://juejin.cn/post/6844904186644004872

你可能感兴趣的:(MVC/MVP/MVVM框架,databinding,mvvm)