日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

DataBinding 学习系列(2)详解DataBinding在xml中的使用

發(fā)布時(shí)間:2024/1/17 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DataBinding 学习系列(2)详解DataBinding在xml中的使用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

#前言#

上一篇簡(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&lt;String&gt;" /><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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。