Android基礎(chǔ)入門之dataBinding的簡單使用教程
前言
dataBinding是實(shí)現(xiàn) view 和 data 綁定的工具,把數(shù)據(jù)映射到 view 的 xml中,可以在 xml 布局文件中實(shí)現(xiàn) view 的賦值,方法調(diào)用。使用 DataBinding 后,我們不用再寫 findViewById,不用再獲取控件對象,不用再設(shè)置監(jiān)聽,可以節(jié)省我們 activity 中的很多獲取控件,賦值,添加監(jiān)聽所需要的代碼。
可以說MVP + DataBinding就是MVVC(關(guān)于MVC,MVP,MVVC的區(qū)別可看往期文章)
1.前期準(zhǔn)備
1.1打開dataBinding
1.2修改布局文件
選中布局文件的第一行,按alter+enter
就會彈出提示,默認(rèn)選中data binding layout
改造好的的新的布局文件里最大的變化就是多了一對<data></data>
標(biāo)簽;很容易想到這是為了實(shí)現(xiàn)布局文件里數(shù)據(jù)和布局的分離,以及更好的實(shí)現(xiàn)數(shù)據(jù)與視圖的雙向綁定(這里文章后面會慢慢介紹)
1.3修改Activity方法
修改好布局文件之后,還需要對Activity文件做修改
使用了dataBinding之后,編譯器會自動(dòng)幫我們生成一個(gè)類名+Binding的新類,這其實(shí)是編譯器幫我們把布局文件轉(zhuǎn)換成了一個(gè)java文件,可以看到我們通過ctrl+鼠標(biāo)左鍵點(diǎn)擊這個(gè)類可以直接訪問到布局文件
除此之外還需要為mainBinding這個(gè)對象賦初值,同樣是通過setContentView
方法,不過要傳入兩個(gè)參數(shù),前者是Activity類,后者是布局文件的id
mainBinding=DataBindingUtil.setContentView(this,R.layout.activity_main);
2.DataBinding的使用
2.1屬性更新
那么如何使用dataBingding呢?
我們先在布局文件中新建幾個(gè)控件,這里我的兩個(gè)控件:文本控件的id是textview
,按鈕控件的id是button
回到Activity中,我們通過mainBInding對象可以看到,其下有兩個(gè)值,textView
和button
,這正是我們剛剛兩個(gè)組件的id,所以通過mainBinding對象我們可以輕松的取到我們布局文件里的組件,不再需要findViewById
了
通過mainBinding獲取到組件同樣的可以設(shè)置這些控件的各種屬性
2.2<data>標(biāo)簽
之前有提到在<data></data>
標(biāo)簽中定義數(shù)據(jù)
在<androidx.constraintlayout.widget.ConstraintLayout>
中定義布局并且綁定數(shù)據(jù),這類似于前端vue框架中的數(shù)據(jù)視圖雙向綁定
2.2.1簡單數(shù)據(jù)的定義與綁定
那么如何在data標(biāo)簽中定義數(shù)據(jù)呢?
通過標(biāo)簽,定義數(shù)據(jù)的名字name和類型type,這個(gè)類型可以是java中的所有基本類型
然后到布局中,用插值表達(dá)式將數(shù)據(jù)替代掉
不過現(xiàn)在什么也不會顯示,因?yàn)檫@兩個(gè)變量只定義了,沒有賦值
看到這,我們也明白data標(biāo)簽的好處之一了,數(shù)據(jù)的定義都在data標(biāo)簽中,而constraint中就只管布局,通過插值表達(dá)式來綁定數(shù)據(jù),不會出現(xiàn)數(shù)據(jù)。
那么data標(biāo)簽里的數(shù)據(jù)又如何初始化賦值呢?
這部分邏輯操作就交給Activity了。每定義一個(gè)varible,在布局的Binding類中都會生成此變量的get和set方法,通過這兩個(gè)方法我們對數(shù)據(jù)進(jìn)行初始化和更新。
所以有了dataBinding我們極大的減輕了Activity所要做的操作,Activity可以更專注于對數(shù)據(jù)與邏輯的處理,而UI的獲取與數(shù)據(jù)和UI的綁定都交給了布局文件。
2.2.2復(fù)雜數(shù)據(jù)的定義與綁定
我們嘗試一下類類型的數(shù)據(jù)的定義與綁定
先定義一個(gè)簡單的實(shí)體類,簡單的寫兩個(gè)屬性
在data中定義一個(gè)類變量,name屬性的同樣是這個(gè)變量的名字,type屬性就是這個(gè)包名.類名
數(shù)據(jù)的綁定也是一樣的,通過類變量的名字.屬性,所以我們可以把類變量person看成Person類new 出來的一個(gè)對象
回到Activity中對類變量進(jìn)行初始化,運(yùn)行可以看到UI上的數(shù)據(jù)已經(jīng)更新了
2.3事件綁定
dataBinding可以把事件以數(shù)據(jù)的形式綁定到布局文件中
2.3.1點(diǎn)擊事件綁定
首先我們在Activity中定義一個(gè)內(nèi)部類
然后在data標(biāo)簽中定義這個(gè)內(nèi)部類的變量
通過onClick
屬性實(shí)現(xiàn)事件的綁定,值得注意的是myclick.onClick
方法后沒有括號;這樣簡單的幾行代碼就實(shí)現(xiàn)了事件的綁定。用戶每點(diǎn)擊一次按鈕都會調(diào)用MyClick類
中的onClick()方法
android:onClick="@{myclick.onClick}"
而Activity只需要做的事情就是初始化這個(gè)點(diǎn)擊事件。因?yàn)榇藭r(shí)事件已經(jīng)被當(dāng)成數(shù)據(jù)在使用了,通過set方法設(shè)置Myclick的值即可。然后打印日志查看運(yùn)行效果
mainBinding.setMyclick(new MyClick());
可以看到每點(diǎn)擊一次按鈕都會打印一次日志,說明調(diào)用成功
2.3.2點(diǎn)擊事件回傳數(shù)據(jù)
我們看到onClick()方法中,我們傳入的是view參數(shù),那可以傳其他參數(shù)嗎?
public class MyClick{ public void onClick(View view){ Log.i("myclick", "onClick: 點(diǎn)贊成功!"); } }
當(dāng)然是可以的而且我們是通過這一種方法事件點(diǎn)擊回傳數(shù)據(jù)。如我們把Person作為參數(shù)傳入,并綁定點(diǎn)擊事件,那么用戶點(diǎn)擊按鈕,又可以將數(shù)據(jù)傳回到Activity中。
改造一下onClick()方法,傳入?yún)?shù)改為Person
并在布局文件中重新綁定,這里綁定事件也有點(diǎn)不同了,需要用到lambda表達(dá)式
android:onClick="@{()->myclick.onClick(person)}"
點(diǎn)擊按鈕,可以看到把person中的數(shù)據(jù)傳了回來;
2.3.3動(dòng)態(tài)改變對象數(shù)據(jù)在控件上顯示
默認(rèn)情況下,在點(diǎn)擊事件監(jiān)聽方法中修改person對象的值并不會修改數(shù)據(jù)在控件上的顯示
如果我們要實(shí)現(xiàn)事件監(jiān)聽動(dòng)態(tài)去改變控件上的數(shù)據(jù)的話,我們需要對Person類動(dòng)一動(dòng)手腳
讓Person類繼承BaseObservable
類,并為每個(gè)屬性生成get和set方法
在點(diǎn)擊事件監(jiān)聽方法中通過調(diào)用set方法設(shè)置新的值,來修改person對象的值并在控件上的顯示
2.3.4動(dòng)態(tài)改變基本數(shù)據(jù)在控件上顯示
首先在Activity中定義一個(gè)name變量,不過需要使用ObservableField類包裝
其后在data標(biāo)簽中定義一個(gè)name變量,并將其綁定在一個(gè)新的文本控件上。
這里值得注意的是在<>符號里不能再出現(xiàn)<>,所以我們使用轉(zhuǎn)義符<
和>
最后在單擊事件方法中更新name的值,這個(gè)值就會動(dòng)態(tài)的更新在界面上
2.4與輸入控件結(jié)合
首先在界面中添加一個(gè)新的輸入控件,并為其綁定一個(gè)變量,這里我就綁定name變量。那么我們剛剛把name變量綁定在一個(gè)文本控件上,現(xiàn)在又把name綁定在一個(gè)輸入控件上。那么我們在輸入控件中對name變量的改變會及時(shí)更新顯示在文本控件上嗎?
當(dāng)然是可以的不夠我們的數(shù)據(jù)綁定要做一個(gè)小小的修改,僅僅添加了一個(gè)等于符號,那這個(gè)實(shí)時(shí)輸入顯示的功能就實(shí)現(xiàn)啦?。?!
android:text="@={name}"
動(dòng)圖看一下效果
2.5與圖片控件結(jié)合
通過dataBinding和imageView和Glide的結(jié)合使用,可以很方便的加載一張網(wǎng)絡(luò)圖片
第一步我們還是先在布局文件中添加一個(gè)圖片控件
然后添加Glide依賴和網(wǎng)絡(luò)請求權(quán)限
//引入第三方庫glide implementation 'com.github.bumptech.glide:glide:4.13.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.13.0'
然后再Activity中創(chuàng)建一個(gè)靜態(tài)的公共的方法,傳入imageView和網(wǎng)絡(luò)圖片的url兩個(gè)參數(shù);并為其添加一個(gè)注解BindingAdapter()
@BindingAdapter("imageUrl") public static void bindImageUrl(ImageView view,String url){ Glide.with(view) .load(url) .into(view); }
然后在布局文件中就出現(xiàn)了一個(gè)imageUrl的屬性,通過這個(gè)屬性我們?yōu)槲覀兊膱D片組件動(dòng)態(tài)的添加網(wǎng)絡(luò)圖片。這里為了方便我還是綁定@{name}
,在Activity中將name初始化為一個(gè)圖片的url
這其實(shí)是我們為控件自定義了一個(gè)屬性,名字叫imageUrl,(其實(shí)就是注解里的那個(gè)參數(shù),你取這個(gè)自定義的屬性叫什么它就叫什么)
總結(jié)
到此這篇關(guān)于Android基礎(chǔ)入門之dataBinding的簡單使用的文章就介紹到這了,更多相關(guān)Android dataBinding使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android把svg圖片轉(zhuǎn)為jpg保存到相冊圖庫
這篇文章主要為大家詳細(xì)介紹了Android把svg圖片轉(zhuǎn)為jpg保存到相冊圖庫,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05解析Android開發(fā)優(yōu)化之:對界面UI的優(yōu)化詳解(二)
在一個(gè)應(yīng)用程序中,一般都會存在多個(gè)Activity,每個(gè)Activity對應(yīng)著一個(gè)UI布局文件。一般來說,為了保持不同窗口之間的風(fēng)格統(tǒng)一,在這些UI布局文件中,幾乎肯定會用到很多相同的布局2013-05-05Android中Activity啟動(dòng)默認(rèn)不顯示輸入法解決方法
這篇文章主要介紹了Android中Activity啟動(dòng)默認(rèn)不顯示輸入法解決方法,一般是因?yàn)榘琧heckbox控件導(dǎo)致Activity啟動(dòng)默認(rèn)不顯示輸入法,本文給出了正確解決方法,需要的朋友可以參考下2015-06-06Android簡單的利用MediaRecorder進(jìn)行錄音的實(shí)例代碼
MediaRecorder可以進(jìn)行簡單的錄音,由于操作簡單所以可以用來進(jìn)行基本的錄音。下面提供一個(gè)簡單的例子,記得在Mainfest文件中添加權(quán)限2013-08-08Android編程實(shí)現(xiàn)下載時(shí)主界面與詳細(xì)界面一致更新的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)下載時(shí)主界面與詳細(xì)界面一致更新的方法,涉及Android事件監(jiān)聽及界面動(dòng)態(tài)更新相關(guān)操作技巧,需要的朋友可以參考下2017-11-11