如何使用View的setTag,getTag findViewWithTag和方法

 我来答
殿智n
2016-08-05 · TA获得超过1.5万个赞
知道大有可为答主
回答量:9036
采纳率:81%
帮助的人:2288万
展开全部
  1. 用于区分很多相似的View

    例如:

    button1.setOnClickListener(new OnClickListener ... );  
    button2.setOnClickListener(new OnClickListener ... );

    可能执行相似的逻辑,但必须分别为两个Button设置两个独立的OnClick事件,

    public void onClick(View v) {  
        doAction(1); // 1 for button1, 2 for button2, etc.  
    }

    之所以这样做,因为onClick只有一个参数View。可以通过setTag和getTag来完成:

    button1.setTag(1);  
    button2.setTag(2);

    可以将两个button设置同一个OnClickListener,比如:

    listener = new OnClickListener() {  
        @Override  
        public void onClick(View v) {  
            doAction(v.getTag());  
        }  
    };

    这样,就能够通过getTag区分。

  2. 用于ListView的复用
    写自定义adapter的时候,通常会使用它,比如:

    static class ViewHolder {  
        TextView tvPost;  
        TextView tvDate;  
        ImageView thumb;  
    }  
      
    public View getView(int position, View convertView, ViewGroup parent) {  
      
        if (convertView == null) {  
            LayoutInflater inflater = myContext.getLayoutInflater();  
            convertView = inflater.inflate(R.layout.postitem, null);  
      
            ViewHolder vh = new ViewHolder();  
            vh.tvPost = (TextView)convertView.findViewById(R.id.postTitleLabel);  
            vh.tvDate = (TextView)convertView.findViewById(R.id.postDateLabel);  
            vh.thumb = (ImageView)convertView.findViewById(R.id.postThumb);  
            convertView.setTag(vh);  
        }  
                ....................  
    }
  3. 注意:除了上述情况以外,尽量不要直接使用,原因:

    一、代码可读性:会给其他的程序员造成困扰

    二、由于setTag和getTag设置的是一个Object对象,可能会出现类的转换异常

    不过,android4.0以后,有一个更好的方法:setTag(int
    key, Object tag)可以通过类似<k,v>键值对的方式存取。

就烦条0o
2016-07-29 · 知道合伙人软件行家
就烦条0o
知道合伙人软件行家
采纳数:33315 获赞数:46492
从事多年系统运维,喜欢编写各种小程序和脚本。

向TA提问 私信TA
展开全部
1. 此行是您的罪魁祸首的一部分:
com.jacksmartie.PhotoMem.MainActivity$1.onItemClick(MainActivity.java:79)

把断点的位置:
Log.d("View 1", imageView.toString());

并期待您的ImageView参考对象[ImageView的],我期待什么,这是一个空没有链接了正常。
如果为null,那你的链接到参考的观点是不正确的。如果多数民众赞成的话,那么你需要将其正确地分配喜欢跳:
Button b = findViewById(R.id.Button01);

然而,由于“什么似乎是列表视图,那拉动略有不同。那你拉视图的方式是错误的 CodeGo.net,背上的研究,应该找帮助清除了!
祝你好运!
JOX
+
2.
那么,这些愿望在哪里它的崩溃。并且它不是清楚自己在做什么。
public View getView(int position, View view, ViewGroup parent) {
imageView.setTag(position);
return imageView;

在哪里imageView自称?什么是它设置为?
private OnItemClickListener itemClickListener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
ImageView imageView;
//Variable i, here, is from a for loop.
imageView = (ImageView)v.findViewWithTag(i);

你声明称为第二局部变量imageView在这里,击打它会消失,当你退出范围。如果你依靠此设置为您的imageView变量,你不喜悦。i是从for循环,但如何与本position在getView()方法?
+
3.
对空指针发生在ImageView的variabkle是空的,因为findviewbyid没有找到视图,跳如果一个复选标记,如果它是空的,因为它没有Android的日志不能打印,而不是设置标签的空变量,尝试设置ID这样做
imageView.setId(正电子);
如果我理解正确,做的ID在adapter和自生成视图它并没有一个默认。
该标签是推杆所需要的视图它的自我作为一个辅助变量visely它的对象:)
如果你明确需要那么标记检查视图实际上是存在的,这意味着你是不是重新检查写入标签一路上
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式