web-dev-qa-db-fra.com

Liaison de données Android - "Aucun identifiant de ressource trouvé pour l'attribut"

Mon fichier de mise en page:

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
            xmlns:tools="http://schemas.Android.com/tools"
            xmlns:app="http://schemas.Android.com/apk/res-auto"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            tools:context=".MainActivity">

<TextView
      Android:text="@string/hello_world"
      Android:layout_width="wrap_content"
      app:fontName="Roboto-Regular.ttf"
      Android:layout_height="wrap_content"/>

</RelativeLayout>

Ma méthode d'adaptateur de reliure:

public class FontBinding {

  @BindingAdapter("bind:fontName")
  public static void setFontName(TextView view, @NonNull String fontName) {
    String fontPath = "/fonts/" + fontName;

    Typeface typeface = Typeface.createFromAsset(view.getContext().getAssets(), fontPath);

    view.setTypeface(typeface);
  }
}

L'erreur que j'obtiens:

Error:(8) No resource identifier found for attribute 'fontName' in package 'com.example.databindingproject'

Suivi du tutoriel depuis https://developer.Android.com/tools/data-binding/guide.html . Avez-vous des idées sur ce que je pourrais mal faire?

27
marius bardan

Vous devez utiliser la syntaxe de liaison de données. CA devrait etre:

<TextView
      Android:text="@string/hello_world"
      Android:layout_width="wrap_content"
      app:fontName='@{"Roboto-Regular.ttf"}'
      Android:layout_height="wrap_content"/>
52
George Mount

Cette même erreur peut également se produire si vous oubliez l'accolade fermante:

Android:text="@{viewModel.foo"
10
Wolfgang

Si vous voulez passer dp/px value à @BindingAdapter - n'oubliez pas de l'envelopper avec une syntaxe de liaison, c'est-à-dire "@ {}"  

Vous devez utiliser dimens.xml pour transmettre la valeur:

app:compoundDrawableSize="@{@dimen/icon_size}"

L’adaptateur de liaison associé vous permettant de définir une taille copiable pour un TextView ressemblerait à ceci:

/**
 * Binding adapter to set the size of TextView's compound drawable
 *
 * Usage:
 * <TextView   [...]
 *       Android:drawableLeft="@{@drawable/ic_myicon}"
 *       app:compoundDrawableSize="@{@dimen/icon_size}"
 *  />
 */
@BindingAdapter("bind:compoundDrawableSize", "Android:drawableLeft", "Android:drawableStart",
        "Android:drawableRight", "Android:drawableEnd", requireAll = false)
fun TextView.setCompoundDrawableSize(px: Float, @IntegerRes drawableLeft: Drawable?, @IntegerRes drawableStart: Drawable?,
                                     @IntegerRes drawableRight: Drawable?, @IntegerRes drawableEnd: Drawable?) {
    val compoundDrawableLeft = drawableLeft ?: drawableStart
    val compoundDrawableRight = drawableRight ?: drawableEnd
    compoundDrawableLeft?.setBounds(0, 0, px.toInt(), px.toInt())
    compoundDrawableRight?.setBounds(0, 0, px.toInt(), px.toInt())
    this.setCompoundDrawables(compoundDrawableLeft, null, compoundDrawableRight, null)
}