databinding是Google推出的一款可以把視圖和數(shù)據(jù)源直接綁定的依賴庫。這篇文章只是介紹databinding的使用最住,和MVVM并沒有什么關(guān)系箫津。
一俭嘁、導(dǎo)入依賴
在app的build.gradle中導(dǎo)入依賴。
implementation 'com.jakewharton.rxbinding3:rxbinding:3.0.0'
并且在android{}中開啟databinding
android{
dataBinding {
enabled = true
}
}
二肴颊、使用方法
1.創(chuàng)建AClass類
使用Observable來對xml進行綁定
public class AClass {
public ObservableField<String> text= new ObservableField<>("");
}
當xml引用AClass 后氓栈,AClass中的屬性數(shù)據(jù)變化就會引起引用對應(yīng)屬性的xml顯示變化,同樣婿着,xml有響應(yīng)時也會對應(yīng)AClass中屬性的變化授瘦,從而實現(xiàn)雙向綁定。
2.創(chuàng)建activity_demo.xml
以<layout></layout>為根標簽竟宋,<data></data>為模型創(chuàng)建xml提完,示例:
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<import type="com.example.demo.AClass" />
<variable
name="aClass"
type="AClass" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@={aClass.text}"/>
</LinearLayout>
</layout>
需要注意的是:<layout></layout>標簽不能有寬高
創(chuàng)建好xml之后會自動生成對應(yīng)的BR文件,就像R文件一樣袜硫。
3.創(chuàng)建DemoActivity
Activity中需要初始化databinding
public class DemoActivity extends AppCompatActivity {
protected ActivityDemoBinding mDataBinding;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initAAC();
}
/**
* 初始化AAC組件
*/
private void initAAC() {
mDataBinding = DataBindingUtil.setContentView(this, R.layout.activity_demo);
SparseArray<Object> variableSA = new SparseArray<>();
variableSA.put(BR.aClass, CastUtil.cast(new AClass()));
if (variableSA != null && variableSA.size() > 0) {
for (int i = 0; i < variableSA.size(); ++i) {
final int variableId = variableSA.keyAt(i);
final Object variableValue = variableSA.valueAt(i);
mDataBinding.setVariable(variableId, variableValue);
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
//銷毀DataBinding
if (mDataBinding != null) {
mDataBinding.unbind();
}
}
}
4.用到一個工具類CastUtil
public class CastUtil {
/**
* 用于消除類型裝換警告
* @param obj 原類型數(shù)據(jù)
* @param <T> 泛型
* @return 裝換類型后的數(shù)據(jù)
*/
@SuppressWarnings("unchecked")
public static <T> T cast(Object obj) {
return (T) obj;
}
}
以上就完成了databinding雙向綁定氯葬。
三、xml中databinding的寫法
databinding在xml中的用法有很多婉陷,我也只是用過幾種帚称。想到的就先記錄一下官研,剩下的之后想到了再補充。
1.給控件設(shè)置文本:
android:text="@={aClass.text}"
public ObservableField<String> text= new ObservableField<>("Hello World");
2.給控件設(shè)置點擊事件:
android:onClick="@{aClass.click}"
public View.OnClickListener click=v -> {
//點擊的操作
text.set("你好闯睹,世界");
};
3.給控件設(shè)置顯示隱藏
(1)<data></data>中添加View包戏羽,控件可以使用三元運算符android:visibility='@{aClass.visibility?View.VISIBLE:View.GONE}'
<!-- 放在data標簽里 -->
<import type="android.view.View" />
<!-- 放在需要操作的控件里 -->
android:visibility='@{aClass.visibility?View.VISIBLE:View.GONE}'
(2)直接設(shè)置ObservableInt
android:visibility='@{aClass.visibility}'
public ObservableInt visibility = new ObservableInt(View.VISIBLE);
4.給控件設(shè)置drawable
正常情況下的shape直接設(shè)置就好,有種情況是drawable隨著條件不同會動態(tài)變化楼吃。
android:drawable='@{aClass.status?@drawable/shape_1:@drawable/shape_2}'
這樣就可以依靠status的改變而改變樣式了始花。
唯一需要注意的一點就是現(xiàn)在databinding中不支持mipmap中文件的引用。如果想引用圖片的話孩锡,還是放在drawable文件夾下吧酷宵。
還有許多許多用法,一時想不起來那么多躬窜,也沒用過那么多浇垦,以后有機會再補充吧。
四荣挨、自定義屬性
有些時候男韧,可能會無法滿足需求,這個時候就需要去自己定義自己想要的屬性了默垄。比如直接給ImageView設(shè)置網(wǎng)絡(luò)圖片地址的時候此虑。
@BindingAdapter(value = "imageUrl", requireAll = false)
public static void setSrc(ImageView imageView, String url) {
Glide.with(imageView.getContext()).load(url)
.into(imageView);
}
這樣就可以用imageUrl來設(shè)置網(wǎng)絡(luò)圖片了。
<ImageView
imageUrl="@{aClass.url}"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
public ObservableField<String> url= new ObservableField("");