2016-04-22 45 views
4

我曾经使用view.setTag(t1);将标签设置为视图,然后使用parent.findViewWithTag(t1);获取正确返回的视图。Android findViewWithTag查看具有多个标签的视图

我现在需要设置2个不同的标签我的意见,我这样做,使用

view.setTag(R.id.tag1, t1); 
view.setTag(R.id.tag2, t2); 

其中Tag1和标签2在RES /价值/ ids.xml宣布IDS

我再试图使用标签t1获取视图,但parent.findViewWithTag(t1);返回null。我搜索,并没有方法findViewWithTag或类似的,也会接受标签的关键。

有什么办法可以达到这个目的吗?如果没有,你能指出我在android文档中的位置吗?

在这种特殊情况下,我可以使用id而不是其中一个标签,但对于那些不可能的情况,我想知道是否可以使用标签来实现。

回答

3

findViewWithTag(tag)返回视图,默认标签由setTag(tag)设置,而使用tag.equals(getTag())进行比较。

1

为补充Diegos答案,我想指出来的源代码:

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/view/View.java#18288

if (tag != null && tag.equals(mTag)) { 

用于比较和查找视图中的标签是由设置mTag使用如看到的源代码在这条线的直接方法setTag(Object)

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/view/View.java#18505

public void setTag(final Object tag) { 
    mTag = tag; 
} 
0

的方法View.getTag()View.findViewWithTag()将只返回被View.setTag()分配给特定ViewObject,也看到了documentation

但是,您可以编写自己的findViewWithTag()方法:

public View findViewWithTag(@NonNull View parent, int tagID, @NonNull Object myTag) 
{ 
    for (int i = 0; i < parent.getChildCount(); i++) 
    { 
     View v = parent.getChildAt(i); 
     if (myTag.equals(v.getTag(tagID))) 
     { 
      return v; 
     } 
    } 
    return null; 
} 

你也可以通过添加像(v instanceof mySpecificView)一些条件的if条款缩小搜索的View具体子类。