Zweiwege-Datenbindung (in XML), ObservableField, BaseObservable, welche sollte ich für die Zweiwege-Datenbindung verwenden?

Ich verwende die Datenbindung bereits seit einiger Zeit, sie ist jetzt jedoch nicht mehr für JDK 8 und API 24 verfügbar. Ich finde immer noch eine Möglichkeit, die Datenbindung einfacher zu nutzen. Aber wenn ich den folgenden Weg benutze, um die genaue bidirektionale Datenbindung durchzuführen (In meinen Augen ist die bidirektionale Datenbindung das Gleiche wie hier Was ist bidirektionale Bindung?), etwas seltsames ist passiert.

1. Zweiwege-Datenbindung (in xml)

android:text="@={testStr}"

Dies wird nicht erwähnt in der offiziellen Dokumentation https: //developer.android.com/topic/libraries/data-binding/index.htm, diese Seite wird normalerweise aktualisiert, kann jetzt geändert werden). Es ist jedoch möglich, die Variable an die XML zu binden.

2. ObservableField für die Attribute

Beispiel von hier https: //developer.android.com/topic/libraries/data-binding/index.html#observablefield)

private static class User {
   public final ObservableField<String> firstName =
       new ObservableField<>();
   public final ObservableField<String> lastName =
       new ObservableField<>();
   public final ObservableInt age = new ObservableInt();
}

3. Erweitern Sie die Modellklasse auf BaseObservable

private static class User extends BaseObservable {
   private String firstName;
   private String lastName;
   @Bindable
   public String getFirstName() {
       return this.firstName;
   }
   @Bindable
   public String getLastName() {
       return this.lastName;
   }
   public void setFirstName(String firstName) {
       this.firstName = firstName;
       notifyPropertyChanged(BR.firstName);
   }
   public void setLastName(String lastName) {
       this.lastName = lastName;
       notifyPropertyChanged(BR.lastName);
   }
}

Die Modellklasse muss @ se erweitert um das BaseObservable Klasse, und auch die Getter-Methode muss mit @ kommentiert werd "@ Bindable" und die Setter-Methode müssen die Methode @ aufrufnotifyPropertyChange () mit entsprechender Benennung in der Bindungs-XML.

Meine Frage ist, ich möchte den Nachteil und die Vorteile für drei Bindungsmethoden kennen. Natürlich weiß ich, dass der erste einfacher sein wird. Aber irgendwann habe ich in der Dokumentation und auf irgendeiner Webseite gefunden. Und es verschwand im nächsten Moment. Die offizielle Dokumentation wird ohne klare Ankündigung geändert. Ich frage mich immer noch, ob ich die erste Methode verwenden soll, damit ich mich darauf vorbereiten muss, die Methode 2 oder 3 zu ändern.

Student_XML2WAY.java

public class Student_XML2WAY {
    private int age;
    private String name;
    public int getAge() {
        return age;
    }
    public void setAge(int pAge) {
        age = pAge;
    }
    public String getName() {
        return name;
    }
    public void setName(String pName) {
        name = pName;
    }
}

Student_ObserField.java

public class Student_ObserField {
    private ObservableInt age;
    private ObservableField<String> name;
    public Student_ObserField() {
        age = new ObservableInt();
        name = new ObservableField<>();
    }
    public ObservableInt getAge() {
        return age;
    }
    public ObservableField<String> getName() {
        return name;
    }
}

Student_Extend.java

public class Student_Extend  extends BaseObservable{
    private int age;
    private String name;

    @Bindable
    public int getAge() {
        return age;
    }
    public void setAge(int pAge) {
        age = pAge;
        notifyPropertyChanged(BR.student3);
    }
    @Bindable
    public String getName() {
        return name;
    }
    public void setName(String pName) {
        name = pName;
        notifyPropertyChanged(BR.student3);
    }
}

activity_main.xml

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

    <data>

        <variable
            name="student1"
            type="example.com.testerapplication.sp.bean.Student_XML2WAY"/>

        <variable
            name="student2"
            type="example.com.testerapplication.sp.bean.Student_ObserField"/>

        <variable
            name="student3"
            type="example.com.testerapplication.sp.bean.Student_Extend"/>

    </data>

    <LinearLayout

        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
      >

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@={student1.name}"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{student2.name}"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{student3.name}"/>
        <Button
            android:id="@+id/btn1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="update"/>
    </LinearLayout>
</layout>

Aktivitätsklasse

public class MainActivity extends AppCompatActivity {
    private Student_XML2WAY mStudent1;
    private Student_ObserField mStudent2;
    private Student_Extend mStudent3;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding binding = DataBindingUtil.inflate(LayoutInflater.from(this), R.layout.activity_main, null, false);
        mStudent1 = new Student_XML2WAY();
        mStudent1.setName("XML First");
        mStudent2 = new Student_ObserField();
        mStudent2.getName().set("ObserField Second");
        mStudent3 = new Student_Extend();
        mStudent3.setName("Extend Third");
        binding.setStudent1(mStudent1);
        binding.setStudent2(mStudent2);
        binding.setStudent3(mStudent3);
        setContentView(binding.getRoot());
        binding.btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mStudent1.setName("Student1");
                mStudent2.getName().set("Student2");
                mStudent3.setName("Student3");
            }
        });
    }
}

Antworten auf die Frage(4)

Ihre Antwort auf die Frage