猿问

setTag()getTag()View方法的主要目的是什么?

setTag()getTag()View方法的主要目的是什么?

这些方法的主要目的是什么?setTag()getTag()View输入对象?

我是否正确地认为,我可以将任意数量的对象与一个视图关联起来?


蝴蝶不菲
浏览 830回答 3
3回答

海绵宝宝撒

假设您生成了一堆类似的视图。你可以设置一个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());     }};它基本上是视图的一种方式记忆.

慕丝7291255

我想加几个词。虽然使用get/setTag(Object)在ViewHolder模式的特殊情况下,似乎非常有用,我建议在其他情况下使用它之前要三思。几乎总是有另一个好的设计解决方案。主要原因是代码很快就变得不可支持了。对于其他开发人员来说,您设计的要作为标记存储在视图中的内容并不明显。setTag/getTag方法根本不是描述性的。它只存储一个Object,所以它需要在您想要的时候进行强制转换。getTag..稍后,当您决定更改标记中存储对象的类型时,可能会发生意外的崩溃。这是现实生活中的故事。我们有一个相当大的项目,有很多适配器,带有视图的异步操作等等。一位开发商决定set/getTag在他的部分代码中,但是另一个已经为这个视图设置了标记。最后,有人找不到自己的标签,非常困惑。我们花了好几个小时才找到窃听器。setTag(int key, Object tag)看起来好多了,因为您可以为每个标记生成唯一的键(使用ID资源),但是Android<4.0有一个很大的限制。来自Lint Docs:在Android4.0之前,View.setTag(int,Object)的实现将把对象存储在静态映射中,其中的值被强烈引用。这意味着,如果对象包含指向上下文的任何引用,上下文(指向几乎所有其他内容)将泄漏。如果传递视图,视图将提供对创建视图的上下文的引用。类似地,视图持有者通常包含视图,游标有时也与视图相关联。

杨__羊羊

我们可以用setTag()和getTag()根据我们的需求设置和获取自定义对象。这个setTag()方法接受类型的参数。Object,和getTag()返回Object.例如,Person&nbsp;p&nbsp;=&nbsp;new&nbsp;Person();p.setName("Ramkailash");p.setId(2000001);button1.setTag(p);
随时随地看视频慕课网APP

相关分类

Android
我要回答