4
votes

**** / erreur de liaison de données **** msg: Impossible de trouver le setter pour l'attribut 'app: image_url' avec le type de paramètre java.lang.String sur android.widget.ImageView

La databindig imageview bloquée ci-dessous se trouve mon adaptateur coustom et Imageview. Je réfère Voici [ Impossible de trouver le configurateur pour l'attribut avec le paramètre mais sans trouver de solution, quelqu'un peut-il aider, merci.

@BindingAdapter("app:image_url")
fun loadImage(view: ImageView, logoUrl: String?) {
    if (logoUrl == null) {
        view.setImageResource(R.drawable.alert_dark_frame)
    } else {
        Picasso.with(view.getContext())
            .load(logoUrl)
            .placeholder(R.mipmap.sym_def_app_icon)
            .into(view)
    }
}

<data>
    <import type="android.view.View" />
    <variable name="abc"
              type="com.example.viewmodel.Result"/>
</data>

<ImageView
            android:id="@+id/circleImageView"
            android:layout_width="100dp"
            android:layout_height="100dp"
            app:image_url="@{abc.picture.thumbnail}"
            />


2 commentaires

Cela fonctionne-t-il si vous supprimez app: de l'adaptateur de liaison?


oui j'ai essayé mais ne fonctionne pas


4 Réponses :


4
votes

Il s'agit d'une erreur normale car la classe ImageView ne contient pas de méthode setImageUrl , vous devez donc faire une solution de contournement pour cela en créant une classe qui étend ImageView et contient une méthode nommée setImageUrl qui prend une String comme paramètre et définit l'image à l'intérieur de cette méthode à l'aide de la bibliothèque Picasso :

<com.yourPackage.MyImageView
    android:id="@+id/circleImageView"
    android:layout_width="100dp"
    android:layout_height="100dp"
    app:image_url="@{abc.picture.thumbnail}"
    />

et après cela, vous pouvez l'utiliser dans le xml comme ceci:

public class MyImageView extends ImageView {

    // ... here is the constructors
    public void setImageUrl(String url) {
        Picasso.get().load(url).into(this);
    }
}


2 commentaires

la seule façon que j'ai trouvée est d'utiliser picasso dans onBindViewHolderlike ci-dessous (je sais que ce n'est pas la bonne façon) Picasso.with (c) .load (holder.binding.abc !!. picture.medium) .placeholder (R.mipmap. ic_launcher) Cela résout mon problème pour temp. .into (holder.binding.circleImageView)


Je pensais que lorsque nous créons des attributs personnalisés pour des widgets, nous n'avons qu'à déclarer BindingAdapter ou InverseBindingAdapter. il semble que nous devions également étendre le widget lui-même en tant que classe et déclarer ces méthodes get / set?



12
votes

Pouvez-vous essayer d'ajouter le plugin dans votre fichier build.gradle (app)

apply plugin: 'kotlin-kapt'


4 commentaires

En utilisant cela, j'ai eu un problème dans les classes générées par liaison de données


Quel est le problème que vous rencontrez?


désolé pour la réponse tardive, j'obtiens cette erreur après avoir utilisé le plugin kotlin-kapt ActivityMain2Binding (DataBindingComponent _bindingComponent, View _root, ^ symbol: class DataBindingComponent location: class ActivityMain2Binding


J'ai un problème à ce sujet, et j'ajoute le plugin apply: 'kotlin-kapt' ceci dans mon build.gradle, fonctionne bien. avant d'ajouter cette ligne, cela ne génère même pas d'attr @BindingAdapter dans tout le projet.Merci beaucoup



1
votes

Écrivez le code suivant dans la classe de modèle

<ImageView
            android:id="@+id/movie_image"
            android:layout_width="100dp"
            android:layout_height="100dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.027"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:image_url="@{movieList.component5()}"/>

En XML, écrivez le code suivant

 companion object DataBindingAdapter {
        @BindingAdapter("bind:image_url")
        @JvmStatic
        fun loadImage(imageView: ImageView, image_url: String) {
            Picasso.get().load(image_url).fit()
                    .placeholder(R.mipmap.ic_launcher)
                    .error(R.mipmap.ic_launcher)        
                    .into(imageView)        }
    }


0 commentaires

1
votes

Je viens de changer de

application: srcCompat

à

android: src

dans mon cas, lorsque je l'utilise avec la liaison de données. Fonctionne très bien maintenant. / pre>

NOUVEAU CODE

  <androidx.appcompat.widget.AppCompatImageView
                    android:layout_width="80dp"
                    android:layout_height="80dp"
                    android:textSize="16sp"
                    android:fontFamily="@font/avenir_roman"
                    android:textColor="@color/textColor"
                    android:src="@{model.image}"/>


0 commentaires