web-dev-qa-db-ja.com

Glideを使用する場合、エラー「GlideがターゲットにしているビューでsetTag()を呼び出さないでください」

アプリで Glide library inner custom adapter viewを使用します。しかし、私はエラーがあります:

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

私のコードのこの部分:

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

それを修正する方法は?

38
Amay Diam

キーは_ViewTarget.setTagId_です。これを設定すると、setTagのデフォルトのImageViewが解放されるため、アイテムレイアウトのルートとして使用できます。 issue#37 でGlide 3.6.0に導入されました。

あなたのマニフェストにこれを追加してください:

_<application
        Android:name=".App"
_

次に、アプリケーションコンテキストクラスを作成します。

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

_src/main/values/ids.xml_の内容として次を追加します。

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

(または、上記の_<item ... />_をresourcesvalues xmlに追加するだけです)

UpdateViewTargetは4.8.0以降廃止されました。 into(ImageView)を使用している場合、組み込みの_*ViewTarget_クラスはまだ古いクラスを拡張するため、非推奨のクラスのメソッドを呼び出す必要があります。

カスタムViewTargetを使用する場合は、代わりにCustomViewTargetに移行します。 CustomViewTargetのデフォルトの動作はGlide固有のIDを使用しているため、タグIDを設定する必要がなくなります。したがって、setTag呼び出しと衝突することはありません。とにかくIDをカスタマイズする場合は、カスタムターゲットでuseTagIdを使用できます。

68
TWiStErRob

Glideは内部でsetTag(Object)メソッドを使用します。したがって、ターゲットビューからsetTag(Object)のすべての呼び出しを削除してください。すなわちImageView

ビューでsetTagメソッドを本当に使用する必要がある場合は、代わりにsetTag(int,Object)メソッドを使用できます。

16
P Vartak

私がグーグルから見つけたものから、グライドとViewHolderはあまりうまくいかないようです。代わりにピカソを試しました。問題はすぐに解決しました。

TWiStErRobのソリューションを試すこともできますが、Glide 3.6.0以降を使用していることを確認してください。 3.5.2でsetTagId(int)を認識しませんでした

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

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

2
Thu Thu

以下を削除した後、私は同じ問題を抱えていました

Android:tag="xx"

私のXMLレイアウト上の画像から、その問題は消えました

1
Shai Epstein

Thu Thu、既存のidViewを単純に参照できます。たとえば、タグをImageViewに設定するとします。

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

他のライブラリを使用する自由がある場合、使用する、そうでない場合はsetTag(int、Object)、しかし上でできない場合 ImageViewをLinearLayoutの基本的なLinearLayout> setTag()> LinearLayoutのsetOnClickListenerにラップします。

何かのようなもの :

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)

OnClickをオーバーライドして:

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

お役に立てれば。

0
Ali Ashraf