错误“您不得在视图上调用setTag()Glide正在定位”使用Glide时

时间:2016-01-17 00:12:07

标签: android android-glide

我在我的应用中使用Glide库内部自定义适配器视图。但我有错误:

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

那么如何解决呢?

8 个答案:

答案 0 :(得分:68)

关键是ViewTarget.setTagId;设置它将释放setTag上的默认ImageView,以便您可以在项目布局中以root身份使用它。 它是在issue #370中的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 ... />添加到resources中的任何values xml中

更新:自{4.8}以来已弃用ViewTarget。如果您正在使用into(ImageView),那么您仍然需要调用已弃用的类的方法,因为内置的*ViewTarget类仍会扩展旧类。

如果您使用自定义ViewTarget,请迁移到CustomViewTarget作为替换。这将消除设置任何标记ID的需要,因为CustomViewTarget的默认行为是使用特定于Glide的ID,因此它不应与任何setTag调用冲突。 如果您仍想自定义ID,可以在自定义目标上使用useTagId

答案 1 :(得分:15)

Glide在内部使用setTag(Object)方法。因此,请从目标视图中删除setTag(Object)的所有来电。即ImageView

如果您确实需要在视图中使用setTag方法,则可以使用setTag(int,Object)方法。

答案 2 :(得分:2)

从我从谷歌搜索中发现,似乎Glide和ViewHolder并不相处得太好。我试过毕加索。问题立即解决了。

您也可以尝试TWiStErRob的解决方案,但请确保您使用的是Glide 3.6.0或更高版本。它无法识别3.5.2

上的setTagId(int)

答案 3 :(得分:2)

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

答案 4 :(得分:1)

删除以下

后,我遇到了同样的问题
android:tag="xx"

从我的xml布局上的图片中,该问题已经消失

答案 5 :(得分:0)

正如Thu Thu所写,您可以简单地引用任何现有id中的View。例如,假设您要将标签设置为ImageView

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

答案 6 :(得分:0)

如果您有使用其他库的权限,请使用,否则 您可以使用 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
        }
    }

希望这会有所帮助。

答案 7 :(得分:0)

使用view.setTage(int,object);和view.getTag(int);