<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
/> </LinearLayout>

1.反例:像这个布局文件,如果要使用DataBinding的话,最外层要改成layout布局的,

但是我以为它最终要改成layout,所以我事先在加入complie和enabled代码前直接改成layout,

    //DataBinding
compile "com.jakewharton.rxbinding:rxbinding:0.4.0"
compile "com.jakewharton.rxbinding:rxbinding-design:0.4.0"
    compileSdkVersion 24
buildToolsVersion "24.0.0"
dataBinding {
enabled = true
}
}

导致在在加入complie和enabled代码后,点击右上角的Sync Now,一直报错

C:\android\ASWorkSpace\HighlyTechnical\tenical\build\intermediates\data-binding-layout-out\debug\layout\activity_main.xml
Error:(11) Error parsing XML: duplicate attribute
Error:Execution failed for task ':tenical:processDebugResources'.
> com.android.ide.common.process.ProcessException: Failed to execute aapt
Information:BUILD FAILED

莫名奇妙的错误。

DataBinding注意事项Error parsing XML: duplicate attribute以及如何在listview中使用DataBinding-LMLPHP

搞了半天都不知道是什么原因,

原来是我们要将根布局变成layout,还要去掉根布局的width和height

 <?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</RelativeLayout> </layout>

2.

(1)获取到的DataBinding对象,是根据布局文件命名的

ListItemHomeBinding binding = DataBindingUtil.inflate(LayoutInflater.from(UIUtils.getContext()), R.layout.list_item_home, parent, false);

而布局文件要先实现根布局为layout,

 <?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
>
<data>
<variable
name="ListBean"
type="com.weizh_000.googleplay.domain.HomeBean.ListBean"/> </data> <TextView
android:text="@{ListBean.downloadUrl}"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#000"
android:id="@+id/textView" />
</layout>

然后build一遍,对象名就出来了,但是按ctrl+2+L出来的不是这个名,是

ViewDataBinding,直接用这个也可以,或者自己手动敲对象名。

(2)不仅对象名会创建,对象方法也会被创建。对象方法名是根据data标签中
variable标签的name创建的,例如上面布局文件中的name为ListBean,那么就会创建一个方法名字为setListBean
         @Override
public View getView(int position, View convertView, ViewGroup parent) {
ListItemHomeBinding binding;
if (convertView == null) {
binding = DataBindingUtil.inflate(LayoutInflater.from(UIUtils.getContext()), R.layout.list_item_home, parent, false);
convertView = binding.getRoot();
convertView.setTag(binding);
} else {
binding = (ListItemHomeBinding) convertView.getTag();
} binding.setListBean(getItem(position));
return convertView; }

这是ListView的Adapter中的getView方法,同时也展示了如何在ListView中使用DataBinding。

3.要有data的标签,而data的标签又要有一个类名,所以又得创建一个类,通常这个类是javabean类

05-04 00:01