公式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());
}
ドキュメント から
このインターフェイスは、コンパイル中に生成され、使用されているすべてのインスタンス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を取得します。
@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());
}
}
この方法を使用すると、カスタムデータバインディングをカスタムの方法で作成でき、拡張可能になります。