SetTag()的getTag()方法的主要目的是什么?
View
类型对象的setTag()
和getTag()
等方法的主要用途是什么?
我是否认为我可以将任何数量的对象与单个视图关联?
假设您生成一堆相似的视图。 您可以OnClickListener
为每个视图设置一个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());
}
};
这基本上是观点有回忆的一种方式。
我想补充几句话。
虽然使用get/setTag(Object)
在ViewHolder模式的特殊情况下似乎非常有用,但我建议在使用它之前先考虑三次。 几乎总是有另一个好的设计解决方案。
主要原因是代码很快就变得不可支持。
对于其他开发人员而言,您设计的视图标记是不明显的。 setTag / getTag方法根本不具有描述性。
它只存储一个Object
,所以当你想getTag
时它需要getTag
。 稍后当您决定更改标签中的存储对象类型时,您可能会意外崩溃。
这是现实生活中的故事。 我们有一个非常大的项目,有很多适配器,有视图的异步操作等等。 一位开发人员决定在他的部分代码中set/getTag
,但另一位开发人员已经为此视图设置了标记。 最终有人找不到自己的标签,而且很困惑。 这花费了我们几个小时才能找到错误。
setTag(int key, Object tag)
看起来好多了,因为你可以为每个标签(使用id资源)生成唯一的键值,但是Android <4.0有一个很大的限制。 从Lint文档:
在Android 4.0之前,View.setTag(int,Object)的实现会将这些对象存储在一个静态映射中,其中的值被强烈引用。 这意味着如果对象包含任何指向上下文的引用,则上下文(指向其他所有内容)将会泄漏。 如果您传递一个视图,该视图将提供对创建它的上下文的引用。 同样,视图持有者通常包含一个视图,并且光标有时也与视图相关联。
我们可以使用setTag()
和getTag()
来根据我们的需求设置和获取自定义对象。 setTag()
方法接受Object
类型的参数, getTag()
返回Object
。
例如,
Person p = new Person();
p.setName("Ramkailash");
p.setId(2000001);
button1.setTag(p);
链接地址: http://www.djcxy.com/p/91391.html
上一篇: What is the main purpose of setTag() getTag() methods of View?
下一篇: What exactly is a monkey doing messing with my Android phone?