JetPackのDataBindingの使用

5858 ワード

Androidは数年前にJetpackコントロールを発売しました.その中にDataBindingがあります.このフレームワークはfindView ById()、setText()、setVisibility()、setEnabled()、setOnClickListener()などの方法を書く必要があります.コードの山を書くことを避けます.このフレームワークも使いやすいので、直接buildにあります.gradleでは、次のスクリプトを構成します.
android {
    ...
    dataBinding {
        enabled = true
    }
    ...
}

まずbeanオブジェクトを定義し、xmlレイアウトにbeanのフルパスを導入します.例は次のとおりです.

public class UserBean {

    public int age;
    public String name;

    public UserBean(int age, String name) {
        this.age = age;
        this.name = name;
    }

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

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

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

}

xmlレイアウト、layoutをノードとし、データ型を導入
activity_live_da:



    
          
    

    

        

        
             
    

Activityのコードも簡単です
public class LiveDaActivity extends BaseActivity {

    ActivityLiveDaBinding liveDaBinding;
    UserBean bean;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_live_da);

        ViewDataBinding viewDataBinding = DataBindingUtil.setContentView(this, R.layout.activity_live_da);
        liveDaBinding = (ActivityLiveDaBinding) viewDataBinding;

        bean = new UserBean(18, " Death ");
        bean.isAdult = true;
        liveDaBinding.setUser(bean);
    }

    public void click(View view){
        bean.setAge(38);
        liveDaBinding.setUser(bean);
    }

}

実行後、UIインタフェースにDeathとage:18の文字が表示され、Deathを表示するボタンをクリックすると、年齢のコントロールがage:38に変わります.
上は基本的な書き方で、liveDaBinding.setUser(bean); beanを設定してインタフェースをリフレッシュします.イベントをクリックしてsetuser(bean)を再呼び出したくない場合はどうしますか?BaseObservableという抽象クラスを使用して、UserBeanに継承させ、@Bindable注記でgetメソッドを修飾し、setメソッドでnotifyPropertyChanged()メソッドを呼び出すことができます.
public class UserBean extends BaseObservable {

    public int age;
    public String name;


    public UserBean(int age, String name) {
        this.age = age;
        this.name = name;
    }

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

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

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

    public String getName() {
        return name;
    }

}

notifyPropertyChanged(BR.age)のパラメータについて、getAge()メソッドに@Bindable注記を追加した後、コンパイルするとBRにageという属性が自動的に追加されます.
BaseObservableについては、基本データ型について、ObservableBoolean、ObservableByteなど、Stringやカスタムオブジェクトタイプを使用する場合は、上記xmlのConstraaintLayoutノードに新しいコントロールを追加するなど、ObservableFieldというクラスを使用できます.
 
    

UserBean:
public class UserBean {

    public int age;
    public String name;
    public final ObservableField lastName = new ObservableField<>();


    public UserBean(int age, String name) {
        this.age = age;
        this.name = name;
    }

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

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

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

}

Activityでのclickクリックイベント
     public void click(View view){
        bean.lastName.set("abc");
    }

クリックすると効果が見えます.クリックイベントの登録については、例えば上記xmlでandroid:onClick=「@{user.click}」と書き、UserBeanでclickメソッドを定義するなど、他のクラスに移動することもできます.
    public void click(View view){
        Log.e("UserBean", "UserBean  click: " + view);
    }

クリックすると、印刷ログが表示されます.
xmlのノードには複数のものがあります.データとクリックをUserBeanに置いてもいいし、分割してもいいです.例えば
    
          

          
    


    


ActivityではPresentもセットしておいて、
liveDaBinding.setPresent(new Present());

public class Present {

    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.userName:
                ...
                break;
        }
    }

}

これでいいです.