Fehler „Sie dürfen setTag() nicht für eine Ansicht aufrufen, auf die Glide abzielt“, wenn Glide verwendet wird

Lesezeit: 5 Minuten

ich benutze Gleiten Ansicht der inneren benutzerdefinierten Adapter der Bibliothek in meinen Apps. Aber ich habe Fehler:

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

Dieser Teil meines Codes:

 @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;
    }

also wie kann man es beheben?

  • Wickeln Sie Ihre ImageView in eine ViewGroup (z. B. LinearLayout) ein.

    – Simon Marquis

    19. Januar 2016 um 11:49 Uhr


  • @AmayDiam Ich habe die Lösung gepostet! schönen Tag noch!

    – Jorgesys

    10. Februar 2016 um 3:59 Uhr

Benutzer-Avatar
TWiStErRob

Der Schlüssel ist ViewTarget.setTagId; Wenn Sie es einstellen, wird die Standardeinstellung freigegeben setTag auf der ImageView Sie können es also als Root im Elementlayout verwenden. Es wurde in Glide 3.6.0 eingeführt Ausgabe Nr. 370.

Fügen Sie in Ihrem Manifest Folgendes hinzu:

<application
        android:name=".App"

Erstellen Sie dann eine Anwendungskontextklasse:

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

Fügen Sie Folgendes als Inhalt für hinzu src/main/values/ids.xml:

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

(Oder füge einfach das obige hinzu <item ... /> in irgendwelche resources xml ein values)

Aktualisieren: ViewTarget war seit 4.8.0 veraltet. Wenn Sie verwenden into(ImageView)müssen Sie immer noch die Methode der veralteten Klasse aufrufen, da die eingebaute *ViewTarget Klassen erweitern immer noch die alte Klasse.

Wenn Sie eine benutzerdefinierte verwenden ViewTargetzu migrieren CustomViewTarget als Ersatz. Dadurch entfällt die Notwendigkeit, eine Tag-ID festzulegen, da das Standardverhalten für CustomViewTarget verwendet eine Glide-spezifische ID, daher sollte sie mit keiner kollidieren setTag Anrufe. Wenn Sie die ID trotzdem anpassen möchten, können Sie verwenden useTagId auf Ihrem benutzerdefinierten Ziel.

  • Diese Lösung funktioniert nicht. Die Lösung besteht darin, einfach den Aufruf der Methode setTag() zu vermeiden.

    – Jorgesys

    26. Februar 2016 um 15:32 Uhr

  • @Elenasys Dieser Ansatz konfiguriert Glide so, dass es mit Single- kompatibel istImageView Artikel auflisten. ich öffnete #370 was zum Hinzufügen der führte setTagId Methode fast ein Jahr vor dieser Frage in Erwartung, dass sie später auftauchen könnte. Glide muss Anfragen irgendwie mit Zielen (Ansichten) verknüpfen und so wurde es ursprünglich entworfen und es funktioniert in den meisten Fällen gut. In anderen Fällen benötigen Sie möglicherweise eine kleine Konfiguration, genau wie bei jedem anderen Framework / jeder anderen Bibliothek.

    – TWiStErRob

    26. Februar 2016 um 16:08 Uhr


  • @Elenasys Es funktioniert tatsächlich. Habe es gerade probiert. Der Aufruf von setTag() ist manchmal unvermeidlich, insbesondere wenn die ImageView eine benutzerdefinierte Ansicht aus einer Bibliothek eines Drittanbieters ist.

    – PinguinBlues

    23. Juni 2016 um 11:03 Uhr

  • @JasonStack Es ist wirklich einfach, folgen Sie einfach, wohin diese ID geht und wer anruft getRequest(). Glide speichert das Anforderungsobjekt standardmäßig im Standard-Tag der Ansicht. Beachten Sie die unterschiedliche Überlastung von setTag basierend auf dem Vorhandensein einer benutzerdefinierten ID.

    – TWiStErRob

    13. Dezember 2017 um 15:26 Uhr

  • ViewTarget ist veraltet!

    – Ahmed Hegazy

    9. April 2019 um 17:04 Uhr

Benutzer-Avatar
P Wartak

Glide verwenden setTag(Object) Methode intern. Entfernen Sie also alle Anrufe von setTag(Object) aus Ihrer Zielansicht. dh ImageView

Wenn Sie wirklich verwenden müssen setTag Methode aus Ihrer Sicht, die Sie verwenden können setTag(int,Object) Methode statt.

  • Vielen Dank. Wenn Sie eine ganzzahlige Konstante als ersten Parameter verwenden, erhalten Sie eine Ausnahme: java.lang.IllegalArgumentException: The key must be an application-specific resource id.. Siehe also die akzeptierte Antwort oder stackoverflow.com/questions/2859574/….

    – CoolMind

    26. November 2018 um 16:13 Uhr


  • Ja, Sie müssen die Ressource für den ersten Parameter verwenden. Wie in SetTag(int,Object) JavaDoc erwähnt

    – P Wartak

    28. November 2018 um 5:29 Uhr

Benutzer-Avatar
Shaahin Sh

Nach dem, was ich bei Google gefunden habe, scheinen Glide und ViewHolder nicht allzu gut miteinander auszukommen. Ich habe es stattdessen mit Picasso versucht. Problem sofort gelöst.

Sie können auch die Lösung von TWiStErRob ausprobieren, aber stellen Sie sicher, dass Sie Glide 3.6.0 oder höher verwenden. Es hat setTagId(int) auf 3.5.2 nicht erkannt

  • Danke für den Versionstipp, ich habe meine Antwort aktualisiert. Wir sind bei 3.7.0 und es gibt keinen Grund, nicht die neueste Version zu verwenden (Glide ist veraltet).

    – TWiStErRob

    26. Februar 2016 um 10:39 Uhr

  • Ein weiterer Softfix dafür, den ich verwendet habe, besteht darin, die ImageView in eine andere Ansicht wie CardView einzubinden und jetzt das Tag für die Kartenansicht festzulegen. (Wenn Sie das Tag verwenden müssen).

    – Deepak Kumar

    17. September 2019 um 7:28 Uhr

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.
                            }
                        }
                    });

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

Ich hatte das gleiche Problem, nachdem ich Folgendes entfernt hatte

android:tag="xx"

Aus dem Bild in meinem XML-Layout war dieses Problem verschwunden

Benutzer-Avatar
Ali Aschraf

Wenn Sie die Freiheit dazu haben andere Bibliothek verwendenverwenden, sonst können Sie verwenden setTag(int, Objekt)aber wenn du das oben nicht kannst Wrap ImageView in einem einfachen LinearLayout > setTag() auf LinearLayout > setOnClickListener auf LinearLayout.

Etwas wie :

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)

Überschreiben Sie onClick und :

@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
        }
    }

Hoffe das hilft.

Wie geschrieben von Thu Thukönnen Sie einfach auf eine verweisen id von eventuell vorhandenen View. Angenommen, Sie möchten Tag auf an setzen ImageView:

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

1055270cookie-checkFehler „Sie dürfen setTag() nicht für eine Ansicht aufrufen, auf die Glide abzielt“, wenn Glide verwendet wird

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy