为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

蝴蝶不菲 2019-06-17 16:50:10
setTag()getTag()View方法的主要目的是什么?这些方法的主要目的是什么?setTag()和getTag()的View输入对象?我是否正确地认为,我可以将任意数量的对象与一个视图关联起来?
查看完整描述

3 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

假设您生成了一堆类似的视图。你可以设置一个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());
    }};

它基本上是视图的一种方式记忆.


查看完整回答
反对 回复 2019-06-17
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

我想加几个词。

虽然使用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)的实现将把对象存储在静态映射中,其中的值被强烈引用。这意味着,如果对象包含指向上下文的任何引用,上下文(指向几乎所有其他内容)将泄漏。如果传递视图,视图将提供对创建视图的上下文的引用。类似地,视图持有者通常包含视图,游标有时也与视图相关联。


查看完整回答
反对 回复 2019-06-17
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

我们可以用setTag()getTag()根据我们的需求设置和获取自定义对象。这个setTag()方法接受类型的参数。Object,和getTag()返回Object.

例如,

Person p = new Person();p.setName("Ramkailash");p.setId(2000001);button1.setTag(p);


查看完整回答
反对 回复 2019-06-17
  • 3 回答
  • 0 关注
  • 829 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信