web-dev-qa-db-ja.com

Android databindingの「DataBindingComponent」クラスとは何ですか?

公式APIドキュメントでDataBindingComponentを確認しました。

https://developer.Android.com/reference/Android/databinding/DataBindingUtil.html

このインターフェイスは、コンパイル中に生成され、使用されているすべてのインスタンスBindingAdaptersのゲッターを含みます。 BindingAdapterがインスタンスメソッドの場合、メソッドを実装するクラスのインスタンスをインスタンス化する必要があります。このインターフェイスは、get *という名前の各クラスのゲッターで生成されます。*は、BindingAdapterクラス/インターフェイスを宣言する単純なクラス名です。名前の衝突は、ゲッターに数値のサフィックスを追加することで解決されます。

このクラスのインスタンスは、最初のパラメーターとして静的またはインスタンスのBindingAdaptersに渡すこともできます。

Dagger 2を使用する場合、開発者はこのインターフェースを拡張し、拡張インターフェースにコンポーネントとして注釈を付ける必要があります。

ただし、このクラスの使用例をWebで見つけることはできません。それが何であり、どのように使用するか誰でも知ることができます。

簡単なコードを作成してデバッグし、それが何かを確認しようとしましたが、a変数にnull変数が表示されました。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ActivityMainBinding binding= DataBindingUtil.setContentView(this,R.layout.activity_main);
    Android.databinding.DataBindingComponent a = DataBindingUtil.getDefaultComponent();
    setContentView(binding.getRoot());
}
20
Long Ranger

ドキュメント から

このインターフェイスは、コンパイル中に生成され、使用されているすべてのインスタンスBindingAdaptersのゲッターを含みます。 BindingAdapterがインスタンスメソッドの場合、メソッドを実装するクラスのインスタンスをインスタンス化する必要があります。このインターフェイスは、get *という名前の各クラスのゲッターで生成されます。*は、BindingAdapterクラス/インターフェイスを宣言する単純なクラス名です。名前の衝突は、ゲッターに数値のサフィックスを追加することで解決されます。

このクラスのインスタンスは、最初のパラメーターとして静的またはインスタンスのBindingAdaptersに渡すこともできます。

Dagger 2を使用する場合、開発者はこのインターフェースを拡張し、拡張インターフェースにコンポーネントとして注釈を付ける必要があります。

これは、このインターフェイスがカスタム_@BindingAdapter_メソッドを実装するインスタンスのファクトリを注入するために使用および生成されることを示しています。このように、さまざまな状況またはレイアウトのデータバインディングを構成したり、より一般的な状態を提供したりできます。 Android StudioのデフォルトのDataBindingComponentクラスを見ると、build /にありますgenerated/source/apt/dev

DataBindingComponentで使用できるメソッドは次のとおりです

あなたがのようなインターフェースを定義することを考えると

_public interface Foo {
    @BindingAdapter("foobar")
    void fooBar(View view, String baz);
}
_

_Android.databinding.DataBindingComponent_インターフェースが生成されます

_public interface DataBindingComponent {
    di.pkg.Foo getFoo();
}
_

この_@BindingAdapter_ホストはデータバインディングで使用されますが、インターフェースを自分で実装し、上記のようなメソッドの1つで使用する必要があります。

_DataBindingUtil.setDefaultComponent(new DataBindingComponent(){
    @Override
    public Foo getFoo() {
        return new Foo() {
            @Override
            public void fooBar(View view, String baz) {
                if (view instanceof TextView) ((TextView) view).setText(baz);
            }
        };
    }
});
_

この例では、デフォルトのコンポーネントを自分で設定したことがないため、DataBindingUtil.getDefaultComponent()からnullを取得します。

19
tynn

@tynnから回答を読んだ後、DataBindingComponentクラスは、データバインディングメソッドの「オブジェクト」スコープとしても使用できます。すべてのメソッドを静的に設定する代わりに、次の例を使用して拡張可能でカスタムにすることができます。たとえば、ImageView、TextView、Viewタイプの3つのバインディングメソッドをセットアップします。最初にインターフェースをセットアップできます(APIのRetrofit 2セットアップインターフェースのように)

1。最初にセットアップ3インターフェース

ImageViewBindingInterface.Java

public interface ImageViewBindingInterface {
    @BindingAdapter({"bind:imageUrl", "bind:error"})
    public  void loadImage(ImageView view, String url, Drawable error);
}

TextViewBindingInterface.Java

public interface TextViewBindingInterface {
    @BindingAdapter({"bind:font"})
      void setFont(TextView textView, String fontName);
}

ViewBindingInterface.Java

public interface ViewBindingInterface {
    @BindingAdapter("Android:paddingLeft")
    public  void setPaddingLeft(View view, int padding);
    @BindingAdapter("Android:onViewAttachedToWindow")
    public  void setListener(View view, ViewBindingAdapter.OnViewAttachedToWindow attached);
}

2。DataBindingComponent.Javaは、@ tynnが次のように述べられているように自動的に更新されます。

Android StudioのデフォルトのDataBindingComponentクラスを見ると、build/generated/source/apt/devにあります。

public interface DataBindingComponent {
    example.com.testerapplication.binding.ViewBindingInterface getViewBindingInterface();
    example.com.testerapplication.binding.TextViewBindingInterface getTextViewBindingInterface();
    example.com.testerapplication.binding.ImageViewBindingInterface getImageViewBindingInterface();
}

。バインディング用の独自の実装メソッドを作成します。

BaseImageViewBinding.Java

public class BaseImageViewBinding implements ImageViewBindingInterface{
    @Override
    public void loadImage(ImageView view, String url, Drawable error) {
          Picasso.with(view.getContext()).load(url).error(error).into(view);
    }
}

BaseTextViewBinding.Java

public class BaseTextViewBinding implements TextViewBindingInterface {
    @Override
    public void setFont(TextView textView, String fontName) {
        textView.setTypeface(Typeface.createFromAsset(textView.getContext().getAssets(), "fonts/" + fontName));
    }
}

BaseViewBinding.Java

public class BaseViewBinding implements ViewBindingInterface {
    @Override
    public void setPaddingLeft(View view, int padding) {
        view.setPadding(padding,
                view.getPaddingTop(),
                view.getPaddingRight(),
                view.getPaddingBottom());
    }
    @Override
    public void setListener(View view, ViewBindingAdapter.OnViewAttachedToWindow attached) {

    }
}

4。OwnDatabindingComponentを設定します

public class MyOwnDefaultDataBindingComponent implements Android.databinding.DataBindingComponent {
    @Override
    public ViewBindingInterface getViewBindingInterface() {
        return new BaseViewBinding();
    }
    @Override
    public TextViewBindingInterface getTextViewBindingInterface() {
        return new BaseTextViewBinding();
    }
    @Override
    public ImageViewBindingInterface getImageViewBindingInterface() {
        return new BaseImageViewBinding();
    }
}

5。アプリケーションでのデフォルトのDataBindingComponentのセットアップ

public class MyApplication extends Application {
    public void onCreate() {
        super.onCreate();
        DataBindingUtil.setDefaultComponent(new MyOwnDefaultDataBindingComponent());
    }
}

この方法を使用すると、カスタムデータバインディングをカスタムの方法で作成でき、拡張可能になります。

23
Long Ranger