Android databinding(详解三)--自定义属性使用
2017-05-22 10:52
453 查看
在上面的几篇文章(Android databinding中Activity详解)从一个例子中解析了,Android databinding的使用,本篇文章是databinding中的自定义属性的使用。
databinding的自定义属性就相当于android中在resource中使用attrs一样,但是使用起来比Android自定义的属性使用的更加方便,下面直接上一些比较常用的自定义的属性。
以上是我在项目所使用的一些通用的自定义属性,在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的实体传递进来。
这样子看起来是不是很简单呢,不必再在resource中定义一大堆的属性,而且属性的类型也不限制于基本的一些类型,相信有一些人通过这个可以感觉通过这个的话,我们自定义view的时候是不是很简单呢?对的,很简单的,只需定义一个layout,声明实体或者就自定义一些字段,layout中使用databinding设置界面,在BindAdapter中设置对应的属性至View的属性中,大概就是如此,有兴趣的小伙伴可以自己试着谢谢,之后再简单介绍一个自定义View来进行解释。
下一篇文章-databinding layout中特殊使用。
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中特殊使用。
相关文章推荐
- Android databinding(详解三)--自定义属性使用
- html5自定义属性data详解及使用方法
- Android中自定义属性Attr的详解使用.
- Android DataBinding使用详解(二)
- Android Service详解(六)---绑定服务BoundService详解之AIDL的自定义属性使用
- Android使用属性动画如何自定义倒计时控件详解
- Android中attr自定义属性详解
- Android中自定义属性的格式详解
- Android中attr 自定义 属性详解
- Android自定义属性,format详解
- 使用 DataFormatString 属性来提供列中各项的自定义格式
- Android自定义View及自定义控件属性declare-styleable:自定义控件的属性(attr.xml,TypedArray)的使用
- Android自定义属性,format详解
- Android 自定义标签属性设置及使用
- Android 两种为自定义组件添加属性的使用方法和区别
- Android之Merge及自定义属性attrs.xml使用 推荐
- HTML5自定义data-* data(obj)属性和jquery的data()方法的使用
- android自定义属性的使用
- Android自定义属性,format详解
- Android自定义属性,format详解