什么是databinding?
Android 团队发布了一个数据绑定框架(Data Binding Library)。以后可以直接在 layout 布局 xml 文件中绑定数据了,无需再 findViewById 然后手工设置数据。
配置
dataBinding{
enabled = true
}
MVVM
至于MVVM基本上和MVP一模一样,感觉只是名字替换了一下。他的关键技术就是今天的主题(Data Binding)。View的变化可以自动的反应在ViewModel,ViewModel的数据变化也会自动反应到View上。这样开发者就不用处理接收事件和View更新的工作,框架已经帮你做好了。
以下给出两篇学习文章
Android MVVM到底是啥?看完就明白了
下面是使用过程中的一些总结:
首先定义了一个工具类
public class StringUtil {
public static String capitalize(final String word) {
if (word.length() > 1) {
return String.valueOf(word.charAt(0)).toUpperCase() + word.substring(1);
}
return word;
}
}
接下来我们要动态绑定,设置TextView的文字,我们可能会这样写
<data>
<variable
name="user"
type="com.example.databindingdemo.User"/>
<variable
name="StringUtil"
type="com.example.databindingdemo.StringUtil"
/>
</data>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="@{StringUtil.capitalize(user.firstName)}" />
但是这样写是有问题的,当你运行程序的时候,会报出下面的错误
大概的意思就是在这个地方不能使用静态的方法,不知道是为什么,但是在使用String的静态方法的时候,却没有报错,比如以下方式
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{String.valueOf(num)}" />
具体原因现在还不知道
<variable
name="list"
type="java.util.ArrayList<String>"/>
这里不能写泛型,否则会报下面的错
接下来看看对boolean的操作
<variable
name="error"
type="boolean"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{error ? "error":"null"}"
/>
网上这样写是没问题的,但是我运行再自己的项目中,就报错了
设置点击事件报错
<variable
name="click"
type="com.example.databindingdemo.MainActivity"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{click.click}" />
然后我们在MainActivity里面
public void click(View view){
user.setFirstName("狗");
}
这时候报下面的错
设置List数据报错
<variable
name="list"
type="java.util.ArrayList"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{list[0]}" />
ArrayList<String> list = new ArrayList<>();
list.add("AA");
list.add("BB");
binding.setList(list);
Error:Execution failed for task ':databindingdemo:compileDebugJavaWithJavac'.
> java.lang.RuntimeException: Found data binding errors.
****/ data binding error ****msg:Cannot find the setter for attribute 'android:text' with parameter type E on android.widget.TextView.
file:E:\workspace\financeApp\databindingdemo\src\main\res\layout\activity_main.xml
loc:45:28 - 45:34
****\ data binding error ****