Android Jetpackコンポーネントは、監視可能なデータオブジェクトを使用します

PS:元のテキストはWeChatパブリックアカウントで最初に公開されました:Jongxingzhi(jzman-blog)

可観測性とは、オブジェクトが他のデータに通知する機能を指します。可観測性には、主に3つのタイプがあります。

  1. フィールド
  2. オブジェクト
  3. セットする

データバインディングを使用すると、データが変更されたときに他のデータの変更を通知し、監視可能なデータオブジェクトをUIにバインドし、データオブジェクトのプロパティが変更されたときにUIを自動的に更新する機能をデータオブジェクトに提供できます。

フィールド

クラスに少数の属性しかない場合、これらのオブジェクトにデータの変更を監視する機能を持たせるために、Observableフィールドを使用してこれを実現できます。Databindingは、8つの基本的なデータ型とParcelableTypesを含むそのような一般的なObservableクラスを提供します。次のとおりです。

  • ObservableBoolean
  • ObservableByte
  • ObservableChar
  • ObservableShort
  • ObservableInt
  • ObservableLong
  • ObservableFloat
  • ObservableDouble
  • ObservableParcelable

それを使用してみましょう。ここでは、文字列とIntを使用して、監視可能なフィールドの使用法を説明します。まず、次のようにエンティティクラスを作成します。

/**
 * Powered by jzman.
 * Created on 2018/12/3 0003.
 */
public class Person {
    
    
    public final ObservableField<String> name = new ObservableField<>();
    public final ObservableInt age = new ObservableInt();
}

次に、次のように、レイアウトファイルで使用する変数を宣言します。

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable
            name="person"
            type="com.manu.databindsample.data.Person"/>
    </data>

    <LinearLayout
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:orientation="vertical">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{`name is `+person.name+`,age is `+person.age}"/>

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="btnClickObservableField"
            android:text="可观察字段"/>

    </LinearLayout>
</layout>

次に、次のように、対応するアクティビティでデータオブジェクトをバインドします。


private Person person;
@Override
protected void onCreate(Bundle savedInstanceState) {
    
    
    super.onCreate(savedInstanceState);
    ActivityObservableObjectSampleBinding binding =
            DataBindingUtil.setContentView(this,R.layout.activity_observable_object_sample);
    person = new Person();
    binding.setPerson(person);
}

最後に、personの値を動的に変更します。Personオブジェクトの属性値が変更されると、その属性値が動的に更新され、次にUIが次のように動的に更新されます。

//动态修改属性值
public void btnClickObservableField(View view) {
    
    
    person.name.set("android");
    person.age.set(10);
}

上記は観測可能なフィールドの使用です。重要なのはオブザーバーの設計モードです。記事の最後にあるテスト効果図を参照してください。

オブジェクト

データバインディングを使用する場合、データバインディングはインターフェースandroid.databinding.Observableを提供し、特定のクラスがこのインターフェースを実装するときにリスナーを登録できます。リスナーは特定のデータオブジェクトの変更を監視し、データオブジェクトの属性に通知します。 、このObservableインターフェースにはリスナーを追加および削除するメカニズムがありますが、データ更新通知を送信するタイミングは特定の実装クラスによって決定されます。開発を簡素化するために、リスナー登録メカニズムを実装する提供されたBaseObserableを使用できます。クラスBaseObservableを継承すると、プロパティがいつ変更されるかが決まります。つまり、対応するgetterメソッドで注釈@Bindableを使用し、対応するsetterメソッドで対応するnotifyPropertyChangedメソッドを呼び出します。監視可能なオブジェクトの特定の使用法を見てみましょう。まず、作成します。データエンティティクラスは次のとおりです。

/**
 * 可观察的数据对象
 * Powered by jzman.
 * Created on 2018/12/4 0004.
 */
public class Student extends BaseObservable{
    
    
    private String name;
    private int age;

    @Bindable
    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
        notifyPropertyChanged(BR.name);
    }

    @Bindable
    public int getAge() {
    
    
        return age;
    }

    public void setAge(int age) {
    
    
        this.age = age;
        notifyPropertyChanged(BR.age);
    }
}

次に、次のように、レイアウトファイルで使用する変数を宣言します。

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable
            name="student"
            type="com.manu.databindsample.data.Student"/>
    </data>

    <LinearLayout
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{`name is `+student.name+`,age is `+student.age}"/>

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="btnClickObservableObject"
            android:text="可观察对象"/>

    </LinearLayout>
</layout>

次に、次のように、対応するアクティビティでデータオブジェクトをバインドします。


private Student student;
@Override
protected void onCreate(Bundle savedInstanceState) {
    
    
    super.onCreate(savedInstanceState);
    ActivityObservableSampleBinding binding =
            DataBindingUtil.setContentView(this,R.layout.activity_observable_sample);
    //可观察对象
    student = new Student();
    binding.setStudent(student);
}

最後に、studentの値を動的に変更します。Studentオブジェクトの属性値が変更されると、その属性値が動的に更新され、次にUIが次のように動的に更新されます。

public void btnClickObservableObject(View view) {
    
    
    student.setName("可观察对象");
    student.setAge(20);
}

上記は、観察可能なオブジェクトの使用です。記事の最後にあるテスト効果図を参照してください。

セットする

コレクションデータは、開発プロセスに関与することがよくあります。データバインディングは、コレクションクラスに監視機能も提供します。ここでは、最も一般的に使用されるMapコレクションとListコレクションを使用して、ObservableMapとObservableListの使用法を説明します。最初に、で使用する変数を宣言します。レイアウトファイル。、詳細は次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <!--ArrayMap-->
        <import type="android.databinding.ObservableArrayMap"/>
        <variable
            name="arrayMap"
            type="ObservableArrayMap&lt;String,String>"/>
        <!--ArrayList-->
        <import type="android.databinding.ObservableList"/>
        <variable
            name="arrayList"
            type="ObservableList&lt;String>"/>
    </data>

    <LinearLayout
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:orientation="vertical">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{`name is `+arrayMap.name+`,age is `+arrayMap.age}"/>

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="btnClickObservableMap"
            android:text="可观察集合之ArrayMap"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{`name is `+arrayList[0]+`,age is `+arrayList[1]}"/>

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="btnClickObservableList"
            android:text="可观察集合之ArrayList"/>
    </LinearLayout>
</layout>


次に、次のように、対応するアクティビティのオブジェクトをバインドしてデータ化します。

private ObservableArrayMap<String,String> arrayMap;
private ObservableArrayList<String> arrayList;
@Override
protected void onCreate(Bundle savedInstanceState) {
    
    
    super.onCreate(savedInstanceState);
    ActivityObservableSampleBinding binding =
            DataBindingUtil.setContentView(this,R.layout.activity_observable_sample);
    //可观察集合之ArrayMap
    arrayMap = new ObservableArrayMap<>();
    binding.setArrayMap(arrayMap);
    //可观察集合之ArrayList
    arrayList = new ObservableArrayList<>();
    binding.setArrayList(arrayList);
}

最後に、コレクションデータをバインドした後、次のようにコレクションデータを変更して、UIの変更を監視できます。

//可观察集合之ArrayMap
public void btnClickObservableMap(View view) {
    
    
    arrayMap.put("name","可观察集合之ArrayMap");
    arrayMap.put("age","30");
}

//可观察集合之ArrayList
public void btnClickObservableList(View view) {
    
    
    arrayList.add("可观察集合之ArrayList");
    arrayList.add("40");
}

上記は、オブザーバブルセットの使用です。

テスト効果

上記の小さなケースを通して、データバインディングによって提供される観測機能を備えたフィールド、オブジェクト、およびコレクションは非常に簡単に使用できると思います。以下は、上記のコードのテスト効果図です。

jzman-ブログ
コミュニケーションと一緒に学ぶことに注意を払ってください。
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/jzman/article/details/107031312