在上面的幾篇文章(Android databinding中Activity詳解)從一個例子中解析了,Android databinding的使用,本篇文章是databinding中的自定義屬性的使用。
databinding的自定義屬性就相當於android中在resource中使用attrs一樣,但是使用起來比Android自定義的屬性使用的更加方便,下面直接上一些比較常用的自定義的屬性。
@BindingAdapter({"image_url"})
public static void loadImage(ImageView view, String url){
if(!StringUtils.isEmpty(url)) {
Glide.with(view.getContext()).load(url).into(view); //設置全緩存.diskCacheStrategy(DiskCacheStrategy.ALL)
}
}
@BindingAdapter({"image_url"})
public static void loadImage(ImageView view, int resoureId){
view.setImageResource(resoureId);
}
@BindingAdapter({"image_url"})
public static void loadImage(DraweeView view, String url){
view.setController(Fresco.newDraweeControllerBuilder().setUri(url).build());
}
@BindingAdapter({"weight"})
public static void setWeight(View view, int weight){
if(weight < 0 ){
weight = 0 ;
}
view.setLayoutParams(new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT,
weight));
}
@BindingAdapter({"imageWidth"})
public static void setImageWidth(ImageView view, float size){
ViewGroup.LayoutParams params = view.getLayoutParams();
params.width = UIUtils.dp2Px(size);
view.setLayoutParams(params);
}
@BindingAdapter({"imageHeight"})
public static void setImageHeight(ImageView view, float size){
ViewGroup.LayoutParams params = view.getLayoutParams();
params.height = UIUtils.dp2Px(size);
view.setLayoutParams(params);
}
@BindingAdapter({"RLMargins"})
public static void setRLMargins(View view, MarginInfo marginInfo){
if (marginInfo == null){
return;
}
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams( ViewGroup.LayoutParams
.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(marginInfo.getLeft(),marginInfo.getTop(),marginInfo.getRight(),
marginInfo.getBottom());
view.setLayoutParams(layoutParams);
}
@BindingAdapter({"LLMargins"})
public static void setLLMargins(View view, MarginInfo marginInfo){
if (marginInfo == null){
return;
}
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( ViewGroup.LayoutParams
.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(marginInfo.getLeft(),marginInfo.getTop(),marginInfo.getRight(),
marginInfo.getBottom());
view.setLayoutParams(layoutParams);
}
以上是我在項目所使用的一些通用的自定義屬性,在databinding中的自定義屬性就是BindAdapter這個註解方法,下面詳細解析BindAdapter的使用:
@BindAdapter這個相當於註解這個方法是一個自定的屬性;{}內部表示使用時這個屬性的名字,比如說@BindAdapter(“{image_url}”),在xml中可以這樣子使用app:image_url=”url”,注意這些自定屬性是在http://schemas.android.com/apk/res-auto這個命名空間下的(也就是data binding的空間下),記得聲明;聲明自定義屬性的方法名是不限制的,遵從Java方法的規範,可以重載等,data binding會針對對應使用的地方,找到相匹配的方法進行設置;方法的參數,第一個必須是View的子類,第二個也就是需要傳進來的數據,可以是任意的數據類型,在xml中也可以用databinding的實體傳遞進來。
xml中的代碼:
<layout xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="click"
type="android.view.View.OnClickListener" />
<variable name="url" type="String"/>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/common_white">
<ImageView
android:id="@+id/act_record_image"
android:onClick="@{click::onClick}"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:image_url="@{url}"/>
</android.support.design.widget.CoordinatorLayout>
</layout>
這樣子看起來是不是很簡單呢,不必再在resource中定義一大堆的屬性,而且屬性的類型也不限制於基本的一些類型,相信有一些人通過這個可以感覺通過這個的話,我們自定義view的時候是不是很簡單呢?對的,很簡單的,只需定義一個layout,聲明實體或者就自定義一些字段,layout中使用databinding設置界面,在BindAdapter中設置對應的屬性至View的屬性中,大概就是如此,有興趣的小夥伴可以自己試着謝謝,之後再簡單介紹一個自定義View來進行解釋。
下一篇文章-databinding layout中特殊使用。