web-dev-qa-db-de.com

Warnung zum benutzerdefinierten Binding-Adapter für Android-Datenbindung

Ich habe die Datenbindungsdokumentation für Custom Binding Adapter für image loading von der offiziellen Android-Entwickler-Site verfolgt: http://developer.Android.com/tools/data-binding/guide. html

Nach erfolgreichem Kompilieren des Codes bekomme ich eine Warnung:

Warning:Application namespace for attribute bind:imageUrl will be ignored.

Mein Code ist wie folgt:

@BindingAdapter({"bind:imageUrl"})
    public static void loadImage(final ImageView imageView, String url) {
        imageView.setImageResource(R.drawable.ic_launcher);
        AppController.getUniversalImageLoaderInstance().displayImage(url, imageView);
    }

Warum wird diese Warnung generiert?

Ein Screenshot ist ebenfalls beigefügt ...  enter image description here

41
asad.qazi

Ich glaube, dass der Namespace in der Annotation BindingAdapter wirklich ignoriert wird. Die Warnung wird angezeigt, wenn Sie ein Namespace-Präfix verwenden, unabhängig davon, ob es mit dem in Ihrem Layout verwendeten übereinstimmt oder nicht. Wenn Sie den Namespace weglassen, wie folgt:

@BindingAdapter({"imageUrl"})

... die Warnung tritt nicht auf.

Ich vermute, die Warnung gibt an, dass der Namespace entfernt wurde, bevor die Zeichenfolge als Schlüssel in der Implementierung der Annotation verwendet wird. Dies ist sinnvoll, wenn Sie bedenken, dass Layouts beliebig viele Namespaces angeben können, z. app: oder bind: oder foo: und die Annotation muss in all diesen Fällen funktionieren.

77
Lorne Laliberte

Versuchen Sie das, arbeiten Sie für mich! Ich hoffe das kann dir helfen. Einfache Möglichkeit, die Bildressource ohne Bindungsadapter zu ändern.

<ImageButton
        ...
        Android:id="@+id/btnClick"
        Android:onClick="@{viewModel::onClickImageButton}"
        Android:src="@{viewModel.imageButton}" />

und Modellklasse anzeigen:

public ObservableField<Drawable> imageButton;
private Context context;

//Constructor
public MainVM(Context context) {
    this.context = context;
    imageButton = new ObservableField<>();
    setImageButton(R.mipmap.image_default); //set image default
}

public void onClickImageButton(View view) {
    setImageButton(R.mipmap.image_change); //change image
}

private void setImageButton(@DrawableRes int resId){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
        imageButton.set(context.getDrawable(resId));
    }else{
        imageButton.set(context.getResources().getDrawable(resId));
    }
}
1
icaksama

Tatsächlich gibt es noch einige Tutorials, die der Annotation BindingAdapter ein Präfix hinzufügen. 

Verwenden Sie @BindingAdapter({"imageUrl"}) ohne Präfix.

<ImageView
    imageUrl="@{url}"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content" />

Profi-Tipp

Sie erhalten keine Warnung, wenn Sie das Android:-Präfix in BindingAdapter verwenden. Weil das ermutigt wird ..__ Ich werde vorschlagen, @BindingAdapter("Android:src") zu verwenden, anstatt ein neues Attribut zu erstellen.

@BindingAdapter("Android:src")
public static void setImageDrawable(ImageView view, Drawable drawable) {
    view.setImageDrawable(drawable);
}

und 

@BindingAdapter("Android:src")
public static void setImageFromUrl(ImageView view, String url) {
   // load image by glide, piccaso, that you use.
}

Erstelle ein neues Attribut nur dann, wenn du es brauchst.

0
Khemraj