web-dev-qa-db-fra.com

Erreur "Vous ne devez pas appeler setTag () sur une vue ciblée par Glide" lors de l'utilisation de Glide

J'utilise Glide la vue interne de l'adaptateur personnalisé de la bibliothèque dans mes applications. Mais j'ai une erreur:

"You must not call setTag() on a view Glide is targeting" 

Cette partie de mon code:

 @Override
    public View getView(int position, View view, ViewGroup container) {
        ViewHolder holder;
        if (view == null) {
            holder = new ViewHolder();
            view = holder.imageView = new ImageView(context);
            view.setTag(holder);
        } else {
            holder = (ViewHolder) view.getTag();
        }

        holder.imageView.setAdjustViewBounds(true);
        LinearLayout.LayoutParams vp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
        holder.imageView .setLayoutParams(vp);
        holder.imageView .setScaleType(ImageView.ScaleType.CENTER_CROP);

        String var_news_article_images = imageIdList.get(getPosition(position));

        Glide.with(context)
                .load(var_news_article_images)
                .placeholder(R.drawable.placeholder)
               .into(holder.imageView);

               return view;
    }

alors comment y remédier?

38
Amay Diam

La clé est ViewTarget.setTagId; sa définition libérera le setTag par défaut sur le ImageView afin que vous puissiez l'utiliser en tant que root dans la disposition de l'élément. Il a été introduit dans Glide 3.6.0 dans numéro # 37 .

Dans votre manifeste, ajoutez ceci:

<application
        Android:name=".App"

Créez ensuite une classe de contexte d'application:

public class App extends Application {
    @Override public void onCreate() {
        super.onCreate();
        ViewTarget.setTagId(R.id.glide_tag);
    }
}

Ajoutez ce qui suit comme contenu pour src/main/values/ids.xml:

<resources>
    <item type="id" name="glide_tag" />
</resources>

(ou ajoutez simplement le <item ... /> ci-dessus dans n'importe quel resources xml dans values)

Mise à jour : ViewTarget est déconseillé depuis 4.8.0. Si vous utilisez into(ImageView), vous devrez toujours appeler la méthode de la classe obsolète, car les classes *ViewTarget Intégrées étendent toujours l'ancienne classe.

Si vous utilisez un ViewTarget personnalisé, migrez vers CustomViewTarget comme remplacement. Cela supprimera la nécessité de définir n'importe quel ID de balise, car le comportement par défaut de CustomViewTarget utilise un ID spécifique à Glide, il ne doit donc pas entrer en conflit avec les appels setTag. Si vous souhaitez malgré tout personnaliser l'ID, vous pouvez utiliser useTagId sur votre cible personnalisée.

68
TWiStErRob

Glide utilise la méthode setTag(Object) en interne. Supprimez donc tous les appels de setTag(Object) de votre vue cible. c'est-à-dire ImageView

Si vous avez vraiment besoin d'utiliser la méthode setTag sur votre vue, vous pouvez utiliser la méthode setTag(int,Object) à la place.

16
P Vartak

D'après ce que j'ai trouvé sur Google, Glide et ViewHolder semblent ne pas bien s'entendre. J'ai plutôt essayé Picasso. Problème résolu instantanément.

Vous pouvez également essayer la solution de TWiStErRob, mais assurez-vous que vous utilisez Glide 3.6.0 ou supérieur. Il n'a pas reconnu setTagId (int) sur 3.5.2

3
Shaahin Sh
ImageView mImageAds = (ImageView) findViewById(R.id.iv_img);
 mImageAds.setTag(R.id.iv_img, i); // "i" means some integer value
 Glide.with(getActivity()).load(urlPath)
                          .placeholder(R.drawable.ads_banner)
                          .diskCacheStrategy(DiskCacheStrategy.ALL)
                          .into(mImageAds);

mImageAds.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            if(mImageAds.getTag() != null) {
                                int position = (Integer) view.getTag(R.id.iv_img);
                                //code here what would you like to do.
                            }
                        }
                    });

Voir aussi: https://androidhiker.blogspot.com/2015/10/how-to-resolve-glide-settag-issue.html

2
Thu Thu

J'ai eu le même problème, après avoir supprimé les éléments suivants

Android:tag="xx"

à partir de l'image sur ma disposition xml, ce problème avait disparu

1
Shai Epstein

Tel qu'écrit par Thu Thu, vous pouvez simplement référencer un id de tout View existant. Par exemple, supposons que vous souhaitiez définir une balise sur un ImageView:

image_view.setTag(R.id.image_view, 100)
if (image_view.getTag(R.id.image_view) == 100) ...
0
CoolMind

Si vous êtes libre d'utiliser une autre bibliothèque , utilisez, sinon vous pouvez utiliser setTag (int, Object) , mais si vous ne pouvez pas faire ci-dessus alors encapsuler ImageView dans un LinearLayout> setTag () de base sur LinearLayout> setOnClickListener sur LinearLayout.

Quelque chose comme :

LinearLayout imgViewLinearLayout = new LinearLayout(context);
            imgViewLinearLayout.setOrientation(LinearLayout.HORIZONTAL);
            imgViewLinearLayout.setId(R.id.dummy_image_layout);
            imgViewLinearLayout.setOnClickListener(this);

ImageView imageView = new ImageView(inflater.getContext());
                imageView.setPadding(0,15,20,0);

                imageView.setId(R.id.imageview_for_glide);

                imgViewLinearLayout.setTag("Image VIEWTAG");
imgViewLinearLayout.addView(imageView)

Remplacez onClick et:

@Override
    public void onClick(View v) {

        if(v.getId() == R.id.dummy_image_layout){
            //Do what you wanna wanted to do on click of ImageView
        }
    }

J'espère que cela t'aides.

0
Ali Ashraf