【转】Android的setTag

前言

首先我们要知道setTag方法是干什么的,SDK解释为

Tags

Unlike IDs, tags are not used to identify views. Tags are essentially an extra piece of information that can be associated with a view. They are most often used as a convenience to store data related to views in the views themselves rather than by putting them in a separate structure.

Tag不像ID是用标示view的。Tag从本质上来讲是就是相关联的view的额外的信息。它们经常用来存储一些view的数据,这样做非常方便而不用存入另外的单独结构。

convertView中的TAG

1.对于使用了LayoutInflater对象进行View扩充的Tag的使用

在之前,在adapter中,我们在getView中是这么些的代码:

public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder holder = null;

if (convertView == null) {

holder = new ViewHolder();

convertView = inflater.inflate(R.layout.vlist2null);

holder.img = (ImageView) convertView.findViewById(R.id.img);

holder.title = (TextView) convertView.findViewById(R.id.title);

holder.info = (TextView)

convertView.findViewById(R.id.info);

// setTag的妙用

convertView.setTag(holder);

else {

// setTag的妙用

holder = (ViewHolder) convertView.getTag();

}

……略

}

注意标红的地方,他们是使用了Tag的。

首先我们要知道setTag方法是干什么的,他是给View对象的一个标签,标签可以是任何内容,我们这里把他设置成了一个对象,因为我们是把vlist2.xml的元素抽象出来成为一个类ViewHolder,用了setTag,这个标签就是ViewHolder实例化后对象的一个属性。我们之后对于ViewHolder实例化的对象holder的操作,都会因为java的引用机制而一直存活并改变convertView的内容,而不是每次都是去new一个。我们就这样达到的重用——我希望我说清楚了。如果有更简单的解释,请指教。

这是我们在Adapter中的使用,那么我们在这里不使用Tag标签会怎么样呢?

我们试想,如果我们不用Tag标签,那么我们的对象如何与convertView缓存结合并达到合理的效率利用?貌似答案并不明朗——所以使用Tag是比较明智的做法。

2.对于没有使用LayoutInflater对象进行View扩充的Tag的使用。

if (convertView != null) {

view = convertView;

...

} else {

view = new Xxx(...);

...

}

这是我们的程序,我们看到,貌似没有用Tag——是的,当没有使用LayoutInflater进行View的扩充的时候,是没有必要用的,虽然也可以用。

3. 对于其他View的Tag使用

我们可以对所有的View对象进行操作,至于怎么用,就看作者怎么想的了,下面举例说一个View的子类button对于tag的一个使用。

直接贴代码了:

public class ButtonTagTestActivity extends Activity implements OnClickListener {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Button button1 = (Button) findViewById(R.id.button1);

Button button2 = (Button) findViewById(R.id.button2);

Button button3 = (Button) findViewById(R.id.button3);

button1.setTag(1);

       button2.setTag(2);

       button3.setTag(3);

button1.setOnClickListener(this);

}

@Override

public void onClick(View arg0) {

// TODO Auto-generated method stub

int tag = (Integer) arg0.getTag();

switch (tag) {

case 1: {

Toast.makeText(this, "我是button1", Toast.LENGTH_LONG).show();

break;

}

case 2: {

Toast.makeText(this, "我是button2", Toast.LENGTH_LONG).show();

break;

}

case 3: {

Toast.makeText(this, "我是button3", Toast.LENGTH_LONG).show();

break;

}

default: {

break;

}

}

}

}

Xml页面代码就不贴了。这个例子是点击界面上的3个button然后会显示用户点击的按钮。我们的程序是实现了页面全局监听,在监听前设置了每个button的tag,之后我们在switch的时候,使用getTag取出的标签来看是什么操作。

这样做的好处是可以将监听集中管理,提高代码的易读性——当然,这是我的自我理解。

后记

看了这么多的实例,我想已经明白了Tag以及convertView。

对我们知道了Tag的作用就是设置标签,标签可以是任意玩意。

以及convertView是如何在程序中使代码运行变的效率的:利用缓存convertView尽可能少实例化同样结构体的对象;

http://blog.csdn.net/dinko321/article/details/7329504

from:http://blog.sina.com.cn/s/blog_4f1c99de01015skb.html

时间: 2024-11-06 03:46:36

【转】Android的setTag的相关文章

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

示例代码: view.setTag(R.string.action_settings,hodler.content); 接收两个值,一个是key值,必须是唯一值,而且要写在values/string.xml 里面,例如 <resources> <item type ="id" name = "ffffff"></item> ....... </resources> 最后调用如下: view.setTag(R.id.ff

android---gettag()与settag()的妙用

在android中,settag(Object)是可以给一个view添加一个特殊的标签,然后用gettag()获取这个标签. 用处1:多个button设置不同tag,通过tag区分 OnClickListener listener = new OnClickListener() { public void onClick(View v) { //获取当前view对应的数字 int cellId = (Integer) v.getTag(); cellClicked(cellId, v); } }

android:View的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, e

Android setTag方法的key问题

android在设计View类时,为了能储存一些辅助信息,设计一个一个setTag/getTag的方法.这让我想起在Winform设计中每个Control同样存在一个Tag. 今天要说的是我最近学习android遇见的setTag的坑.一般情况下我们只需要使用唯一参数的setTag方法.但有时我们需要存储多个数据,所以这个时候我们就需要使用带key的重载. 文档是描述:“ The specified key should be an id declared in the resources of

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

首先我们要知道setTag方法是干什么的,SDK解释为 Tags Unlike IDs, tags are not used to identify views. Tags are essentially an extra piece of information that can be associated with a view. They are most often used as a convenience to store data related to views in the v

Android setTag()/getTag()-(转)

(转自:http://www.cnblogs.com/topcoderliu/archive/2011/06/07/2074419.html) [自己经历:要getTag前提是要有setTag] setTag()/getTag() View中的setTag(Onbect)表示给View添加一个格外的数据,以后可以用getTag()将这个数据取出来. 可以用在多个Button添加一个监听器,每个Button都设置不同的setTag.这个监听器就通过getTag来分辨是哪个Button 被按下. i

Android中View的setTag与getTag行为理解一例

最近在学Android,看到ListView的Adaptor优化这里遇到一点理解上的困难. 目前流行的优化方法是结合convertView和ViewHolder来优化View的创建和查找,如: public class ViewHolderAdapter extends ArrayAdapter { static class ViewHolder { TextView text1; TextView text2; TextView longtext; } public View getView(

Android setTag()/getTag()

View中的setTag(Onbect)表示给View添加一个格外的数据,以后可以用getTag()将这个数据取出来. 可以用在多个Button添加一个监听器,每个Button都设置不同的setTag.这个监听器就通过getTag来分辨是哪个Button 被按下. import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; public

Android之:View的setTag()与getTag()方法使用

通常我们是用findViewById()方法来取得我们要使用的View控件,不过除了这一种方法之处 ,我们还可以用View中的setTag(Onbect)给View添加一个格外的数据,再用getTag()获取到对应的View.setTag()和getTag()方法常用在处理多个相同的View时,比如我们有要对几个Button添加点击事件,我们除了可以用view.getId()来区分Button,也可以给Button设置Tag来进行区分.如: public class TagTestActivit