Android数据绑定框架DataBinding用法
生活随笔
收集整理的這篇文章主要介紹了
Android数据绑定框架DataBinding用法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Android數據綁定框架DataBinding用法
? ? 【尊重原創,轉載請注明出處】http://blog.csdn.net/guyuealian/article/details/51953749 一、數據綁定框架DataBinding介紹: ? ? ?Android的新框架DataBinding給我們帶來了很大的方便,以前可能需要在每個Activity里寫很多的findViewById,不僅麻煩,還增加了代碼的耦合性;而使用DataBinding,就可以拋棄findViewById。Data Binding 解決了 Android UI 編程中的一個痛點,官方原生支持 MVVM 模型可以讓我們在不改變既有代碼框架的前提下,非常容易地使用這些新特性。其實在此之前,已經有些第三方的框架(RoboAndroid) 可以支持 MVVM 模型,無耐由于框架的侵入性太強,導致一直沒有流行起來。說到這里,其實網上也有很多快速的注解框架,但是注解框架與DataBinding想比還是不好用,而且官網文檔說DataBinding還能提高解析XML的速度,其實DataBinding的好用,不僅僅體現在可以省去使用很多啰嗦findViewById,還有很多。二、數據綁定框架DataBinding的用法:
(1)環境搭建:
? ?在使用DataBinding之前,首先要先學會搭建使用它的環境。鑒于是去年發布的,現在大家AS的版本估計都在1.5以上了,就在1.5的版本上搭建和介紹吧,1.5之前的大家可以在網上搜索,因為我看網上大多數是介紹的1.3的使用方法,還沒有很多對于1.5之后的環境搭建方法。 Android 的 Gradle 插件版本不低于 1.5.0-alpha1:
classpath 'com.android.tools.build:gradle:1.5.0'
然后在對應模塊(Module)的 build.grade中添加:
android {....dataBinding {enabled = true} }
(2)例子展示 ? ??例子的源代碼【下載】←點擊下載 ? ??我們先用一個簡單的例子來學習一下DataBinding的基礎: ? ? ?1)首先先建立一個java bean,就是一個非常簡單的Person?類。
package com.example.administrator.myapplication;/*** Created by Administrator on 2016/7/19.*/ public class Person {private String name;private String age;public Person(String name, String age) {this.age = age;this.name = name;}public void setName(String name) {this.name = name;}public void setAge(String age) {this.age = age;}public String getName() {return name;}public String getAge() {return age;} } ? ? ? 2)再來看看使用了DataBinding之后的布局文件,其主要的變化是在layout布局文件之中。 <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"><data><variablename="per1"type="com.example.administrator.myapplication.Person" /><variablename="work"type="String" /></data><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{per1.name}" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{String.valueOf(per1.age)}" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{work}" /></LinearLayout></LinearLayout> </layout> 布局文件中并沒有給控件定義id,而是用了@{ }的方法。Android studio是如何把值傳進去的呢?在Activity中是又是如何使用的呢? ? ? ?3)MainActivity .java文件 package com.example.administrator.myapplication; import android.app.Activity; import android.databinding.DataBindingUtil; import android.os.Bundle; import com.example.administrator.myapplication.databinding.ActivityMainBinding;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// setContentView(R.layout.activity_main);ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);Person per = new Person("zhang san", 40);binding.setPer1(per);//給布局文件name="per1"傳入數據,類型為Person對象binding.setWork("Teacher");//給布局文件name="work"傳入數據,類型為String字符串}} ? ? ?MainActivity?中沒有使用findViewById去指定需要初始化的控件,也沒有使用setText()指定顯示的內容。下面詳細說明一下: ? ? ?1)使用DataBinding新框架必須導入包:import android.databinding.DataBindingUtil; ? ? ?2)以前在onCreate方法中通過setContentView設置布局;現在使用DataBindingUtil類的一個靜態方法setContentView設置布局文件,但該方法會返回一個ActivityMainBinding對象。注意ActivityMainBinding對象會根據你的XML布局文件自動生成,其命名規則是這樣的:先將XML布局文件的首字母大寫;然后去掉下劃線,將下劃線后面的第一字母大寫;再加Binding組合而成。如布局文件是activity_main,則對應的類名為:ActivityMainBinding ? ? ?3)ActivityMainBinding由編譯器根據布局文件的名字自動生成,因此在使用ActivityMainBinding時需要導入該包,一般形式是:當前包名+databinding+ActivityMainBinding import com.example.administrator.myapplication.databinding.ActivityMainBinding; ? ? ? 運行結果效果圖如下:
(3)DataBinding使用說明 ? ? ?1)XML布局文件 ? ? ? 相比以前使用的xml,根節點由具體的某個layout(比如LinearLayout )變成了layout,里面包括了data節點和傳統的視圖。先分析data節點,實質上這里的data節點就是連接 View 和 Modle 的橋梁。在這個data節點中聲明一個variable變量,該變量需要指定name屬性和type屬性值。 <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"><data><variablename="per1"type="com.example.administrator.myapplication.Person" /><variablename="work"type="String" /></data><LinearLayout<LinearLayout……………………</LinearLayout></LinearLayout> </layout> ? ?變量名:?name="per1"
? ? 變量類型:type="com.example.administrator.myapplication.Person"
? ? type中聲明的就是我們的用戶實體類Person,等于全限定名(包+類名),我們給這個實體類命名為per1,per1可以看作是一個Person的對象。TextView中的@{per1.name}就是把這個per1中的名字展示出來,age同樣如此。 ? ? ?變量名:name="work"
? ? ?變量類型:?type="String" ? ? ?那么控件是如何獲得顯示內容的呢? <TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{per1.name}" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{String.valueOf(per1.age)}" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{work}" />? ? ? 注意到TextView的android:text,它的值是一個以@開始,以{}包裹的形式出現,而其內容由per1.name指定。per1就是我們上面定義的variable變量;而name是我們Person類中的一個變量。但name是Person的私有變量啊!!!!其實這里per1.name實質上調用的是Person類的getName()方法,因此per1.name等價于per1.getName()。?因此android:text="@{per1.name}"也可改為android:text="@{per1.getName()}";對于其他控件的分析也如此。 ? ? ?PS:android:text指定的內容為String類型,因此,per1.age是int類型需要轉換為String類型。 ? ? 2)綁定Variable
? ? ?雖然在布局文件中對應上了,但是值是怎么傳進去的呢?這就是我們要將的Activity中的那兩行代碼了,它把實體類和布局文件進行了綁定。修改MainActivity中的onCreate,用 DatabindingUtil.setContentView() 來替換掉 setContentView(),然后創建一個Person對象per?,通過 binding.setPer1(per)與 variable 進行綁定。 ? ? ? 由于在XML文件中,指定?name="per1"的類型為Person,因此setPer1(Person?per),即傳入的類型必須是Person對象;同理在name="work"的類型為String,setWork("Teacher")必須傳入字符串類型。 protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);Person per = new Person("zhang san", 40);binding.setPer1(per);//給布局文件name="per1"傳入數據,類型為Person對象binding.setWork("Teacher");//給布局文件name="work"傳入數據,類型為String字符串}?【注意事項】 ? ? ?【1】 這里需要注意的是使用binding調用setXxx方法,其中Xxx對應XML布局文件 name="Xxx"或者name="xxx";注意XML文件中name屬性值的首字母可大寫,也可小寫。若 name="Xxx",則 binding.setXxx(),若 name="xxx",也是 binding.setXxx(),但不能寫為 binding.setxxx()。
? ? ?【2】注意TextView控件設置顯示文字時,若寫為:android:text="@{per1.age}",則會出現錯誤 String resource ID #0x28
at android.content.res.Resources.getText(Resources.java:244) at android.widget.TextView.setText(TextView.java:3888)
at com.example.administrator.myapplication.databinding.ActivityMa……
? ? ? 這是由于android:text只能接受字符串的屬性值,因此需要轉換一下類型:android:text="@{String.valueOf(per1.age)}" ? ? ?【3】如果出現以下錯誤,(1)可能是因為你沒有指定資源類型,(2)更大的可能是因為你沒有搭配dataBinding環境! Error:(27, 31) No resource type specified (at 'text' with value '@{per1.name.toString()}').
Error:(32, 31) No resource type specified (at 'text' with value '@{String.valueOf(per1.age)}').
Error:(36, 31) No resource type specified (at 'text' with value '@{work}').
? ?【參考資料】 ?關于DataBinding的高級應用,可以參考這些文章: 【1】《Android數據綁定框架DataBinding,堪稱解決界面邏輯的黑科技》?http://www.jianshu.com/p/2d3227d9707d 【2】《?Android官方數據綁定框架DataBinding(一)?》http://blog.csdn.net/qibin0506/article/details/47393725 【3】《Android官方數據綁定框架DataBinding(二)》http://blog.csdn.net/qibin0506/article/details/47720125 【4】英文好的,推薦官網教程:https://developer.android.com/topic/libraries/data-binding/index.html
總結
以上是生活随笔為你收集整理的Android数据绑定框架DataBinding用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Map集合HashMap TreeMap
- 下一篇: BP神经网络的理解