View类型对象的setTag()和getTag()等方法的主要目的是什么?
我认为我可以将任意数量的对象与单个视图相关联是正确的吗?
View类型对象的setTag()和getTag()等方法的主要目的是什么?
我认为我可以将任意数量的对象与单个视图相关联是正确的吗?
当前回答
假设你生成了一堆相似的视图。你可以为每个视图单独设置OnClickListener:
button1.setOnClickListener(new OnClickListener ... );
button2.setOnClickListener(new OnClickListener ... );
...
然后你必须为每个视图创建一个唯一的onClick方法,即使它们做类似的事情,如:
public void onClick(View v) {
doAction(1); // 1 for button1, 2 for button2, etc.
}
这是因为onClick只有一个参数View,它必须从封闭作用域的实例变量或最终局部变量中获取其他信息。我们真正想要的是从视图本身获取信息。
进入getTag / setTag:
button1.setTag(1);
button2.setTag(2);
现在我们可以对每个按钮使用相同的OnClickListener:
listener = new OnClickListener() {
@Override
public void onClick(View v) {
doAction(v.getTag());
}
};
这基本上是一种让视图拥有记忆的方式。
其他回答
假设你生成了一堆相似的视图。你可以为每个视图单独设置OnClickListener:
button1.setOnClickListener(new OnClickListener ... );
button2.setOnClickListener(new OnClickListener ... );
...
然后你必须为每个视图创建一个唯一的onClick方法,即使它们做类似的事情,如:
public void onClick(View v) {
doAction(1); // 1 for button1, 2 for button2, etc.
}
这是因为onClick只有一个参数View,它必须从封闭作用域的实例变量或最终局部变量中获取其他信息。我们真正想要的是从视图本身获取信息。
进入getTag / setTag:
button1.setTag(1);
button2.setTag(2);
现在我们可以对每个按钮使用相同的OnClickListener:
listener = new OnClickListener() {
@Override
public void onClick(View v) {
doAction(v.getTag());
}
};
这基本上是一种让视图拥有记忆的方式。
与id不同,标记不用于标识视图。标签本质上是可以与视图相关联的额外信息。它们最常用来方便地在视图本身中存储与视图相关的数据,而不是将它们放在一个单独的结构中。
参考:http://developer.android.com/reference/android/view/View.html
当你有一个ListView并且想要回收/重用视图时,TAGs的设置非常有用。这样,ListView变得非常类似于更新的RecyclerView。
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder = null;
if ( convertView == null )
{
/* There is no view at this position, we create a new one.
In this case by inflating an xml layout */
convertView = mInflater.inflate(R.layout.listview_item, null);
holder = new ViewHolder();
holder.toggleOk = (ToggleButton) convertView.findViewById( R.id.togOk );
convertView.setTag (holder);
}
else
{
/* We recycle a View that already exists */
holder = (ViewHolder) convertView.getTag ();
}
// Once we have a reference to the View we are returning, we set its values.
// Here is where you should set the ToggleButton value for this item!!!
holder.toggleOk.setChecked( mToggles.get( position ) );
return convertView;
}
这对于使用自定义ArrayAdapter非常有用。这是一种优化。那里setTag被用作引用对象,引用布局的某些部分(显示在ListView中),而不是findViewById。
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);
}
....................
}
对于web开发人员来说,这似乎相当于数据-..