- gradle配置
- xml配置
- “膨脹視圖”
DataBinding是jetpack的一個庫参淹,其作用是擴充xml布局文件的功能统抬,拉近xml和activity/fragment的距離趾徽。使開發(fā)進一步簡便。下面就來介紹DataBinding。
1掰担、gradle配置
在用之前我們得先有它续捂。首先我們得在需要使用該庫的模塊(module)中的build.gradle
文件中相應(yīng)位置加入相應(yīng)的配置:
apply plugin: 'kotlin-kapt'//當(dāng)需要用到注解時添加
android {
//code...
dataBinding {
enabled true //啟用dataBinding
}
//dataBinding.enabled = true 這樣也可以
//code...
}
同步之后就可以使用DataBinding了垦垂。
2、xml配置
xml配置是使用DataBinding第一步牙瓢。往常我們的布局文件是這樣的
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!—-code——>
</androidx.constraintlayout.widget.ConstraintLayout>
希望該xml使用Databinding就需要對它進行改造:
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data class=“MainLayoutBinding”><!——這里有個class屬性——>
<import type="android.text.Html" alias="html"/>
<variable
name="demo"
type="String" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!—-code——>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
你可以將這兩段xml代碼做對比劫拗,多出來的部分就是DataBinding的配置了,接下來我們一點一點來分析這段配置矾克。
2.1页慷、<layout>
標(biāo)簽
該標(biāo)簽是必須的,只有被該標(biāo)簽包裹的布局才能被Databinding識別胁附,所以<layout>
就是布局文件的根標(biāo)簽酒繁。在該標(biāo)簽下有且僅有兩個標(biāo)簽,其中一個是<data>
控妻,另外一個就是原本的布局文件頂級標(biāo)簽州袒。
被DataBinding識別的布局文件都會自動生成一個綁定類,該類的名稱由布局文件名轉(zhuǎn)化而來———下劃線語法變成駝峰語法+Binding:
activity_main.xml
得到的綁定類是:ActivityMainBinding
2.2弓候、<data>
標(biāo)簽
故名思義郎哭,該標(biāo)簽是為DataBinding在該xml中提供數(shù)據(jù)用的他匪,可以看到該標(biāo)簽有一個屬性class
,這是為自動生成的綁定類提供名稱用的夸研,也就是說:
activity_main.xml
會得到這樣的綁定類:MainLayoutBinding
建議在自定義綁定類名時遵循原本的語法:在末尾加上
Binding
,以表示是一個布局綁定類邦蜜。
該標(biāo)簽下可以有兩種標(biāo)簽:<import>
和<variable>
。
<import>
:導(dǎo)入標(biāo)簽亥至,可以對具體的類進行導(dǎo)入悼沈,然后在DataBinding環(huán)境的xml中使用。
type
是需要導(dǎo)入的類的完整類名姐扮,alias
是別名井辆。(你可以將<import>
等效于java/kotlin的imort關(guān)鍵字)
用法:主要用于導(dǎo)入一些類,并使用其中的靜態(tài)方法
<variable>
:變量標(biāo)簽溶握,通過在java/kotlin代碼中調(diào)用相應(yīng)方法傳入具體的對象杯缺,使在xml中可以通過綁定表達式直接使用數(shù)據(jù)對象。
name
是變量名睡榆,type
是變量的類型萍肆。
到這,dataBinding在xml中的配置基本完成胀屿。
2.3塘揣、綁定表達式
在xml中使用在控件中使用Databinding的方式:@{//code…}
舉個例子:
2.4、使用快捷鍵快速配置
你可以在xml布局中將光標(biāo)放在根標(biāo)簽上宿崭,使用快捷鍵option+回車即可呼出以下界面:
選中第一個選項即可完成dataBinding的xml配置亲铡。
該快捷鍵對應(yīng)的是:
可自行在As的keymap配置中進行查找和更改。
3葡兑、膨脹(inflate)視圖
對于普通的布局xml視圖奖蔓,我們可以通過View.inflate()
、LayoutInflater.from(this).inflate()
等方法將xml膨脹為View以致可以在代碼環(huán)境中訪問布局讹堤。而DataBinding也給我們提供了這么一套方法吆鹤,由DataBindingUtil提供,inflate原理和以前是一樣的:
val binding = DataBindingUtil.inflate<ActivityMainBinding>(
layoutInflater,
R.layout.activity_main,
parent,
true
)
如果是給activity設(shè)置根視圖可以這樣:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//code…
val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this,R.layout.activity_main)
//code…
}
還有一種簡便的方法就是通過綁定類的靜態(tài)方法進行inflate:
val binding = ActivityMainBinding.inflate(layoutInflater,parent,true)
這些方法都可以得到一個對應(yīng)綁定類的對象binding
洲守,通過這個對象我們就可以通過屬性(不可變字段)的方式直接訪問布局文件中的信息疑务,這些屬性就是根據(jù)布局文件中的控件id所生成的。(這樣最大的好處就是擺脫了findViewById)梗醇。
3.1知允、結(jié)合LiveData
ViewDataBinding有一個設(shè)置LifecycleOwner
,這樣在綁定表達式中直接綁定LiveData就可以了,無需在activity/fragment中監(jiān)聽叙谨。
3.2温鸽、bind方法的使用
在使用DataBindingUtil類時會發(fā)現(xiàn)有一個bind方法,該方法可以通過一個view重新得到對應(yīng)的綁定類唉俗。
val binding = DataBindingUtil.inflate<ActivityMainBinding>(
//code…
) //得到一個綁定類
val root:View = binding.root //得到一個根View
Val bind:ActivityMainBinding = DataBindingUtil.bind(root)//通過根View再次得到綁定類
想象一下這個場景:
你擁有ActivityMainBinding
類(以下稱為綁定類)嗤朴,但是在某個過程中你需要將他變成一個View使用,比如RecyclerView/ListView的Adapter虫溜。這時你可以通過綁定類的getRoot
方法獲得對應(yīng)的View雹姊。
但是到后面你發(fā)現(xiàn)你還需要綁定類來做一些處理,那么這時你可以通過bind方法重新通過(從getRoot
方法中得到的)View獲得對應(yīng)的綁定類衡楞。
這樣的好處在于你無需一直維護綁定類吱雏,但是在需要的時候隨時可以得到。
3.3瘾境、設(shè)置變量
還記得在xml中的<data>
標(biāo)簽嗎歧杏?其中的<variable>
標(biāo)簽所代表的變量會在綁定類中生成一對get、set方法迷守,我們可以直接設(shè)置:
binding.demo = “這是變量”//由于是kotlin犬绒,所以可以得到一個變量
除了上面的設(shè)置方法,還有另外一種設(shè)置方法:
binding.setVariable(BR.demo,”這是變量”)
這是因為DataBinding會根據(jù)<data>
標(biāo)簽中的<variable>
標(biāo)簽生成對應(yīng)的BR值兑凿。而setVariable
方法并非屬于特定的綁定類凯力,而是屬于他們的父類:ViewDataBinding。
兩者可以得到相同的結(jié)果礼华。
3.4咐鹤、設(shè)置點擊監(jiān)聽器
沒錯,用了dataBinding之后我們幾乎可以不用在代碼上寫 setOnClickListener
方法了圣絮。我們可以通過DataBinding將點擊事件直接綁定到xml上祈惶。
為了方便演示,我將需要綁定的事件就放在Activity上:
- 準(zhǔn)備一個方法:
#Activity
fun onClick(view:View){
//code…
}
- 將activity綁定到DataBinding上
<data class=“MainLayoutBinding”>
<import type="android.text.Html" alias="html"/>
<variable
name="activity"
type="..Activity" /> <!—-activity的完整類名——>
</data>
<LinearLayout…>
<TextView
onClick=“@{view->activity.onClick(view)}”/><!——綁定點擊監(jiān)聽器——>
</LinearLayout>
事實上扮匠,點擊監(jiān)聽器綁定的方式還有其他:
<TextView
onClick=“@{activity.onClick}”/>
<TextView
onClick=“@{activity::onClick}”/>
<!——這兩種和上面的是同樣效果的—->
如果不需要view也可以省掉:
<TextView
onClick=“@{()->activity.onClick()}”/>
至于綁定其他的監(jiān)聽器也是一樣的捧请。
可以看出,對于綁定的方法棒搜,沒有特殊的限制血久,所以點擊事件綁定幾乎可以綁定到任何方法上。
小結(jié)
Databinding是一個操作xml布局的庫帮非,我們可以通過綁定表達式氧吐,將一些屬于View的操作從Activity/Fragment中轉(zhuǎn)移到xml布局文件中,減輕了activity/fragment的負(fù)擔(dān)末盔。
可以直接綁定數(shù)據(jù)筑舅,甚至可以直接綁定一些事件,使得View在activity/fragment中出現(xiàn)的幾率越來越低了陨舱。
當(dāng)然這只是Databinding系列的第一篇翠拣,也是最簡單的一篇,下一篇將介紹dataBinding在xml中具體用法游盲、xml中String多種使用方式误墓、xml中隱藏的那些資源以及綁定適配器(BindingAdapter)