DataBindingの使用

  最近のプロジェクトではMVVMフレームワークを使用していますが、これまで使用したことがないため、最初の使用には少し時間がかかります。フレームワーク自体の概念を理解するのは難しいことではありませんが、このフレームワークでスムーズに開発したい場合は、DataBindingを上手に使用するための最も基本的な前提条件です。言うまでもありませんが、今日は一般的なバインディングの使用法を要約します。

DataBindingの使用プロセスと言うだけです。

android { 
  
    dataBinding {enabled true} 
    
}

1.ルートレイアウトを選択し、Alt + Enterを押します

するとこんな感じになりました

 

2.バインディングオブジェクトを作成します(編集すると、このバインディングオブジェクトはプロジェクトで生成されます。たとえば、activity_main_mvvmは大文字を削除します+ _の後にバインディングします)

活動中

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

フラグメントまたはアダプタバインディングのアイテムレイアウト

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

このようにして、レイアウト内のR.id.tv_name、Javaコード内のbinding.tvName、findViewByIdの保存など、このオブジェクトを介してレイアウト内のコントロールを見つけることができます。

 

3.エンティティエンティティをレイアウトに関連付けて、レイアウト内のエンティティオブジェクトのデータを直接使用できるようにします。つまり、バインドの目的が達成されます。

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

</data>

 

1.データのバインド

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.コントロールがエンティティフィールドのコンテンツを直接表示しない場合、異なる値に応じて異なるテキストを表示します。これは、大きく次の状況に分けることができます。

     ケース1:フィールドの属性をカスタマイズするということは、エンティティクラスで属性を定義することを意味します。(特定のエンティティフィールドには多くのタイプと豊富な意味があり、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图片,也可用此方法处理。
情况二:将网络请求返回的实体进行再处理,将不能直接展示的字段用其他的字段代替,以使控件可以直接展示。这里不做示例。

2.三項演算子

1.ブール値

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}"/>



3クリックイベントバインディング

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

パッケージをインポートするための2つのパラメーター <variablename = "view" type = "View" />

 

 

 

 

おすすめ

転載: blog.csdn.net/lk2021991/article/details/100052308