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


 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5    >
 6 
 7     <TextView
 8         android:layout_width="wrap_content"
 9         android:layout_height="wrap_content"
10         android:text="Hello World!"
11  />
12 
13 </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

莫名奇妙的錯誤。

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

原來是我們要將根布局變成layout,還要去掉根布局的width和height

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <layout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:orientation="vertical"
 4     >
 5     <RelativeLayout
 6         android:layout_width="match_parent"
 7         android:layout_height="match_parent">
 8     <TextView
 9         android:id="@+id/tv_test"
10         android:layout_width="wrap_content"
11         android:layout_height="wrap_content"
12         android:text="Hello World!" />
13     </RelativeLayout>
14 
15 </layout>

 2.

(1)獲取到的DataBinding對象,是根據布局文件命名的

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

而布局文件要先實現根布局為layout,

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <layout xmlns:android="http://schemas.android.com/apk/res/android"
 3     >
 4 <data>
 5     <variable
 6         name="ListBean"
 7         type="com.weizh_000.googleplay.domain.HomeBean.ListBean"/>
 8 
 9 </data>
10 
11 <TextView
12     android:text="@{ListBean.downloadUrl}"
13     android:layout_width="match_parent"
14     android:layout_height="wrap_content"
15     android:textColor="#000"
16     android:id="@+id/textView" />
17 </layout>

然后build一遍,對象名就出來了,但是按ctrl+2+L出來的不是這個名,是

ViewDataBinding,直接用這個也可以,或者自己手動敲對象名。

(2)不僅對象名會創建,對象方法也會被創建。對象方法名是根據data標簽中
variable標簽的name創建的,例如上面布局文件中的name為ListBean,那么就會創建一個方法名字為setListBean
 1         @Override
 2         public View getView(int position, View convertView, ViewGroup parent) {
 3  ListItemHomeBinding binding;
 4             if (convertView == null) {
 5                 binding = DataBindingUtil.inflate(LayoutInflater.from(UIUtils.getContext()), R.layout.list_item_home, parent, false);
 6                 convertView = binding.getRoot();
 7                 convertView.setTag(binding);
 8             } else {
 9                 binding = (ListItemHomeBinding) convertView.getTag();
10             }
11 
12             binding.setListBean(getItem(position)); 
13 return convertView; 14 }

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

 

3.要有data的標簽,而data的標簽又要有一個類名,所以又得創建一個類,通常這個類是javabean類

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM