DataBinding的使用

  最近的一个项目使用的是MVVM框架,由于之前没有使用过所以初次使用还是费了一点时间的。框架本身的思路不难理解,但是要想在这个框架中进行很流畅的开发,DataBinding的熟练使用时最基本的前提。话不多说今天就总结下常见的绑定用法。

简单说DataBinding使用流程:

android {
  
    dataBinding { enabled true }
    
}

1.选中根布局,Alt+Enter

之后变成这样

2.  创造Binding 对象(编一下,项目中会生成这个Binding对象,比如:activity_main_mvvm去掉_之后的首字母大写+Binding)

activity里面

ActivityMainMvvmBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main_mvvm);

fragment里面或者Adapter绑定Item布局

FragmentMainMvvmBinding  binding 
= DataBindingUtil.inflate(inflater, R.layout.fragment_main_mvvm, container, false);

这样通过这个对象就可以找到布局中的控件了,比如布局中R.id.tv_name;  java代码中binding.tvName;省去了findViewById

3.将实体Enity与布局建立关联,这样布局中的就可以直接使用该实体对象的数据了,即是达到了绑定的目的。

<data>
   
    <variable
        name="userInfo"
        type="com.example.laoliu.mytest1.UserInfoEnity" />

</data>

一 .绑定数据

1.简单的数据绑定 (实体里面的某个字段直接展示)

<TextView
    android:id="@+id/tv_name"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:background="#e9b1b1"
    android:gravity="center"
    android:text="@{userInfo.name}" /> <TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#e9b1b1"
android:gravity="center"
android:text="@{userInfo.name,default=`游客`}" />

2.如果说控件不是直接展示enity字段内容,而是根据不同的值来展示不同的文字。大致分为以下几种情况:

     情况一:.对某个字段自定义属性,即是在enity类里面进行定义属性。(enity的某个字段类型比较多,含义比较丰富,在xml很难表达或者在xml表达会导致易读性差)

//根据userType  显示不同的用户类型。value对应的值:自定义属性。第一个参数:控件。第二个参数:绑定的数据。

Enity中:
@BindingAdapter(value = {"userTypeShow"}, requireAll = false)
public static void setUserName(TextView textView, String userType) {
    if (userType != null) {
        switch (userType) {
            case "0":
                textView.setText("游客");
            case "1":
                textView.setText("普通用户");
                break;
            case "2":
                textView.setText("VIP用户");
                break;
        }
    }
}

xml使用:

<TextView
    android:id="@+id/tv_userType"
    android:layout_width="wrap_content"
    android:layout_height="17dp"
    android:layout_marginLeft="10dp"
    android:background="@drawable/level_bg"
    android:gravity="center"
    android:textColor="#FFFFFFFF"
    android:textSize="12sp"
    android:visibility="gone"
    app:userTypeShow="@{userInfo.userType}" />

另外ImageView加载在线url图片,也可用此方法处理。
情况二:将网络请求返回的实体进行再处理,将不能直接展示的字段用其他的字段代替,以使控件可以直接展示。这里不做示例。

二.三目运算符

1.boolean

android:visibility="@{userInfo.checked!=null? View.VISIBLE:View.GONE}"   //字段本来的属性
public boolean isChecked() {   //对某个字段处理然后在获取
    if (!Utils.isEmpty(isRealNameCheck)) {
        return true;
    }
    return false;
}   

在xml直接使用

android:visibility="@{userInfo.isChecked? View.VISIBLE:View.GONE}"

2.int

 android:text="@{userInfo.userName==0? userInfo.userName: `游客`}"
 android:text="@{userInfo.userName==1? userInfo.userName: @string/redacted }"

3.非空处理  

 android:text="@{userInfo.userName?? @string/redacted }"
 相当于
 android:text="@{userInfo.userName==null? userInfo.userName: @string/redacted }"

4.其他 

 android:padding="@{isBig ? @dimen/bigPadding : @dimen/smallPadding}"
 Format字符串格式:
 android:text="@{@string/nameFormat(firstName, lastName)}"
<Button android:onClick="@{isManager ? handlers.managerClick : handlers.managerClick}"/>



三  点击事件的绑定

//无参数
public void onItemClick0() {
    Log.e("TAG", "onItemClick1");
}

//一个参数 View
public void onItemClick1(View view) {
    Log.e("TAG", "onItemClick1:view");
}

//两个参数 public void onItemClick1(String userName) {
   Log.e("TAG", "onItemClick1:userName"); 
 }

//两个参数
public void onItemClick2(View view, String userName) {
    Log.e("TAG", "onItemClick1");
    Toast.makeText(view.getContext(), userName, Toast.LENGTH_LONG).show();
}

xml:

@{() -> clickEvent.onItemClick0()}  onItemClick0()//onItemClick0()

android:onClick="@{clickevent.onItemClick1}"
相当于android:onClick="@{clickevent::onItemClick1}" //onItemClick1(View view)

@{() -> clickEvent.onItemClick1(userInfo.userName)}  //onItemClick1(String userName)
@{(view) -> clickEvent.onItemClick1(userInfo.userName)} //onItemClick2(View view, String userName)

注意:字符串`` 表示, 或者@string/**

对于使用View.Visible 需要导包 集合之类的也需要 

对于两个参数 要导包 <variable name="view" type="View"/>

猜你喜欢

转载自blog.csdn.net/lk2021991/article/details/100052308