DataBinding 学习系列(2)详解DataBinding在xml中的使用
#前言#
上一篇簡(jiǎn)單的介紹了DataBinding的用法,這幾篇來(lái)仔細(xì)的介紹一下的功能。
#data 標(biāo)簽 的功能#
<data class="test"></data> 復(fù)制代碼class 屬性
生成指定的名稱的Binding對(duì)象。什么是Bind對(duì)象呢?來(lái)回顧之前的一句代碼
ViewDataBinding mBinder = DataBindingUtil.setContentView(this, R.layout.activity_main); 復(fù)制代碼通過(guò)這一句,系統(tǒng)會(huì)自動(dòng)幫助我們生成一個(gè)ViewDataBinding的子類,幫助我們操作xml中綁定的數(shù)據(jù),所以就需要給這個(gè)類起一個(gè)響亮的名字,根據(jù)Java的命名規(guī)則,R.layout.activity_main 就會(huì)默認(rèn)生成 ActivityMainBinding,這個(gè)規(guī)則一看就明白。
class屬性就是幫助我們改變生成的類名和位置,有以下三種用法:
1、在模塊封裝包的databinding包中會(huì)生成名為TestBinding的Binding類。
<data class="TestBinding"></data> 復(fù)制代碼2、在這個(gè)情況下,TestBinding類直接在模塊包種生成
<data class="TestBinding"></data> 復(fù)制代碼3、在指定的包下生成Binding類。
<data class="com.example.TestBinding"></data> 復(fù)制代碼如果沒(méi)有特殊需求,使用系統(tǒng)默認(rèn)的命名就可以了。
那生成的ActivityMainBinding 與 ViewDataBinding 之間有什么區(qū)別呢?? 最大的區(qū)別的就在于ActivityMainBinding中為設(shè)置的variable生成了setter 和 getter方法,設(shè)置綁定數(shù)據(jù)更加簡(jiǎn)便。
public class MainActivity extends AppCompatActivity {private ActivityMainBinding mBinder;private User user;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mBinder = DataBindingUtil.setContentView(this, R.layout.activity_main);// 設(shè)置綁定的user對(duì)象user = new User();user.setName("屌爆了");mBinder.setUser(user);// 綁定listener對(duì)象TestClickListener testClickListener = new TestClickListener();mBinder.setListener(testClickListener);}/*** 自定義的點(diǎn)擊回調(diào)監(jiān)聽(tīng)**/public class TestClickListener {public void onClickListenerBinding(View view) {Toast.makeText(MainActivity.this, "1111", Toast.LENGTH_SHORT).show();}} 復(fù)制代碼#data 的子標(biāo)簽#
variable
這個(gè)標(biāo)簽之前已經(jīng)見(jiàn)過(guò)了,他用來(lái)綁定具體的對(duì)象的類。
<variablename="user"type="com.lzp.myapplication.bean.User"/>復(fù)制代碼import
<data><import type="java.util.List"/><variable name="users" type="List<String>" /><import type="com.example.util.StringUtil"/> </data> 復(fù)制代碼請(qǐng)注意,在xml中對(duì)于尖括號(hào)(<>)的使用是很嚴(yán)格的,否則會(huì)影響xml的正常解析,所以在這里必須對(duì)尖括號(hào)進(jìn)行轉(zhuǎn)義,雖然會(huì)紅字報(bào)錯(cuò),但是是可以正常運(yùn)行的。
import 表示引入引入某一個(gè)類,從上面看到引入了java.util.List,然后定了User的列表,還有引入了一個(gè)工具類 com.example.util.StringUtil。
name 是引用的名稱, type是具體的包名+類名,指明具體的類的地址。
那么如果引入了兩個(gè)相同類名的怎么辦?
<data><importtype="com.lzp.myapplication.bean.User" /><importtype="com.lzp.myapplication.User"alias="User2" /></data>復(fù)制代碼import 還有一個(gè)alias屬性,幫助我們來(lái)為引入的對(duì)象起別名,同樣可以引用,這樣就可以區(qū)別相同類名的不同類了。
#如何使用data中引入和定義的內(nèi)容#
variable
使用variable中的bean對(duì)象,如果是屬性,直接使用@{name.field}
<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{user.name}" /> 復(fù)制代碼如果使用的無(wú)參數(shù)方法,@{() -> name.function()}
<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="@{() -> listener.onClickListenerBinding()}"android:text="@{Utility.autoAppend(v,user.name)}" />復(fù)制代碼點(diǎn)擊事件需要把點(diǎn)擊的view傳入并操作,@{(v) -> name.function(v)}
括號(hào)中間的v就表示當(dāng)前的這個(gè)view的參數(shù)名稱(可以自定義),直接作為參數(shù)名使用就可以。
<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="@{(v) -> listener.onClickListenerBinding(v)}"android:text="@{user.name}" /> 復(fù)制代碼import
使用import引入的工具類,@{util.function()}
<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{Utility.autoAppend(user.name)}" />復(fù)制代碼目前在靜態(tài)方法不能通過(guò)使用bean的形式來(lái)傳入view參數(shù),具體解決辦法之后在介紹。
#include#
Includes的使用<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:bind="http://schemas.android.com/apk/res-auto"><data><variable name="user" type="com.example.User"/></data><LinearLayoutandroid:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><include layout="@layout/name"bind:user="@{user}"/><include layout="@layout/contact"bind:user="@{user}"/></LinearLayout> </layout> 復(fù)制代碼系統(tǒng)會(huì)自動(dòng)生成一個(gè)自定義屬性bind,通過(guò)bind可以直接對(duì)include中的layout中綁定的數(shù)據(jù)直接進(jìn)行賦值,這樣就可以間接的控制include中的操作。
#ViewStub#
如果是ViewStub怎么綁定??
binding = DataBindingUtil.setContentView(this, R.layout.activity_view_stub); binding.viewStub.setOnInflateListener(new ViewStub.OnInflateListener() {@Overridepublic void onInflate(ViewStub stub, View inflated) {ViewStubBinding binding = DataBindingUtil.bind(inflated);User user = new User("fee", "lang");binding.setUser(user);} }); 復(fù)制代碼分析上面的代碼,首先ViewStub在尚未添加到xml中時(shí),獲取Bindgin對(duì)象肯定是無(wú)效的,所以需要在OnInflateListener中回調(diào)被添加的事件,然后再去獲Bing對(duì)象。
#總結(jié)#
我們已經(jīng)把DataBinding的大部分使用場(chǎng)景都已經(jīng)講過(guò)了,已經(jīng)能夠滿足大部分場(chǎng)景的需求,從一個(gè)小白直接飆升到了中級(jí)水平,但是勤能補(bǔ)拙,熟能生巧,我們還需要通過(guò)不懈的練習(xí)來(lái)鞏固所學(xué)的知識(shí)。有講錯(cuò)的地方和不足請(qǐng)留言指出,大家一起學(xué)習(xí)進(jìn)步。
下一篇我們來(lái)了解一下DataBinding 在 Java 代碼為我們具體提供了哪些重大的功能。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的DataBinding 学习系列(2)详解DataBinding在xml中的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [译][Tkinter 教程14] me
- 下一篇: HttpContext 来源(Syste