Uso de DataBinding

  Un proyecto reciente utiliza el framework MVVM y como no se ha utilizado antes, toma un poco de tiempo para el primer uso. La idea del marco en sí no es difícil de entender, pero si desea desarrollarse sin problemas en este marco, el requisito previo más básico para el uso competente de DataBinding. No hay mucho que decir, hoy resumiré el uso vinculante común.

Simplemente diga el proceso de uso de DataBinding:

android { 
  
    dataBinding {enabled true} 
    
}

1. Seleccione el diseño raíz, Alt + Enter

Entonces se volvió así

 

2. Cree un objeto de vinculación (Edítelo, este objeto de vinculación se generará en el proyecto, por ejemplo: activity_main_mvvm eliminar la letra mayúscula + vinculación después de _)

en actividad

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

Diseño del artículo en fragmento o enlace de adaptador

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

De esta manera, puede encontrar los controles en el diseño a través de este objeto, como R.id.tv_name en el diseño; binding.tvName en el código java; guarde el findViewById

 

3. Asocie la entidad Enity con el diseño, de modo que los datos del objeto de la entidad en el diseño puedan usarse directamente, es decir, se logre el propósito de vinculación.

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

</data>

 

1. Datos vinculantes

1. Enlace de datos simple (se muestra directamente un campo en la entidad)

<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. Si el control no muestra directamente el contenido del campo de enidad, muestra diferentes textos según diferentes valores. Se puede dividir a grandes rasgos en las siguientes situaciones:

     Caso 1: personalizar atributos para un campo significa definir atributos en la clase enity. (Un cierto campo de enidad tiene muchos tipos y un rico significado, que es difícil de expresar en xml o la expresión en xml conducirá a una legibilidad deficiente)

//根据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;
        }
    }
}

uso 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图片,也可用此方法处理。
情况二:将网络请求返回的实体进行再处理,将不能直接展示的字段用其他的字段代替,以使控件可以直接展示。这里不做示例。

2. Operador ternario

1.booleano

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

Usar directamente en 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. Procesamiento no vacío  

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

 

4. Otro 

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



Enlace de eventos de tres clics

//无参数
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 需要导包 集合之类的也需要 

Para los dos parámetros para importar el paquete  <variable name = "view" type = "View" />

 

 

 

 

Supongo que te gusta

Origin blog.csdn.net/lk2021991/article/details/100052308
Recomendado
Clasificación