关于Android的setTag()方法和getTag()的一个问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Android的setTag()方法和getTag()的一个问题相关的知识,希望对你有一定的参考价值。

我在做一个android开发小示例的时候遇到了这个问题:
在程序画红线的地方,text = (TextView) convertView.getTag();查看API后知道还有一个setTag(Object o)方法,既然参数是Object类型的,那就是说可以是任意类型,text = (TextView) convertView.getTag();,但这句话将getTag()返回的Object对象强制转型为TextVIew,这个转型一定能行吗?可能以前setTag()的参数并不是TextView型的。
不知道我表述清楚没有,谢谢了!!!!

setTag()是设置标签,getTag()是获取标签,作用为:
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.注意:

除了上述情况以外,我们尽量不要直接使用,原因:
1.代码可读性:会给其他的程序员造成困扰
2.由于setTag和getTag设置的是一个Object对象,可能会出现类的转换异常
不过,android4.0以后,有一个更好的方法:setTag(int key, Object tag)可以通过类似键值对的方式存取。

根据以上,你这个转型是不可行的哦。
参考技术A 不知道是什么具体问题?
明白你的问题所在了,这里因为setTag是你调用的,所以你一定知道set进去的是个什么东西。
如果你set进去的时候,不止一种东西,比如你用TextView和ImageView两种作为tag
那么取的时候,就要用instanceof依次判断。
还是那句话,因为是你调用的,所以如果是一种东西,你一定知道它是什么类型
如果是多种,也一定是有限的类型,你可以用if else if结构的instanceof判断出来。
参考技术B 你这些操作都是在getView方法里做的,你都指定了convertView去绑定一个TextView,当然你取convertView中的Tag也要相应的做出强制类型转换(TextView) 参考技术C 你在本类方法中设定绑定与取绑定所以 这样是可以的
当然 推存使用settag的 key values 模式
参考技术D ?

android中View 的 setTag()和getTag()方法,它们是用来干什么的?

如题!希望能按照您自己的理解来描述,不要copy网上的!谢谢!!!!!!

setTag()是给View控件添加一个格外的数据,通俗的讲,就是给控件添加一个标签,当你想用这个控件的时候,可以通过getTag()来获取。打个比方,同一个品牌的衣服,可能有很多款式,厂家通过标签来区分这些不同款式的衣服。 参考技术A 设置标签和获取标签啊,一般都是你不能直接获取或者设置,可以通过这两个set和get方法来得到和设置,在以后的编程会经常用到,避免用户直接修改数据

比如你写个类,类里面有你的年龄,你不想别人修改,就写成private的,那么你想修改就可以在程序里面调用set()和get()两个方法本回答被提问者和网友采纳
参考技术B 设置标签和获取标签啊,一般都是你不能直接获取或者设置,可以通过这两个set和get方法来得到和设置,在以后的编程会经常用到,避免用户直接修改数据

比如你写个类,类里面有你的年龄,你不想别人修改,就写成private的,那么你想修改就可以在程序里面调用set()和get()两个方法
参考技术C Tag是标签的意识,这里的tag是object类型。所以通常会使用setTag()设置不同的Object子类对象,然后使用强制转换getTag()获得对象。

举例说明,listview中Adapter 有个getView方法,可以使用setTag把查找的view缓存起来方便多次重用
public View getView(int
position, View convertView, ViewGroup parent)
ViewHolder vh;
if (convertView == null)
LayoutInflater inflater =
(LayoutInflater) mWidgetsSwitchApp

.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

convertView = inflater.inflate(R.layout.app_gallery_item,
null);
vh = new ViewHolder();
vh.view1 =
(ImageView) convertView.findViewById(R.id.view1);
vh.view2 =
(ImageView) convertView.findViewById(R.id.view2);
vh.view3=
(ImageView) convertView.findViewById(R.id.view3);
vh.view4 =
(ImageView) convertView.findViewById(R.id.view4);

convertView.setTag(vh);//这里的setTag
else
vh = (ViewHolder)
convertView.getTag();//这里的getTag

......
参考技术D 可以用在多个Button添加一个监听器,每个Button都设置不同的setTag。这个监听器可以通过getTag来分辨是哪个Button被按下。

以上是关于关于Android的setTag()方法和getTag()的一个问题的主要内容,如果未能解决你的问题,请参考以下文章

Android setTag()与getTag(),与set多个setTag()

转Android的setTag

Android Volley框架的使用

Swift 中的 Android setTag 等效项

避免在 Android 中将视图设置为 setTag 的值

android 同时setTag两次,保存多种值