【问题标题】:Find all views with tag?查找所有带有标签的视图?
【发布时间】:2011-07-01 00:59:14
【问题描述】:

例如,我希望找到指定活动中具有“气球”标签的所有视图,然后使用 setVisibilityGONE 隐藏它们。

有人知道如何检索带有给定标签的视图列表吗?

【问题讨论】:

  • @jamolkhon:不错且干净的解决方案。

标签: android


【解决方案1】:

您可以通过这种方式为您的视图设置标签:

someView.setContentDescription("MyTag");

然后为了找到所有带有该标签的视图,您需要调用:

ArrayList<View> outputViews = new ArrayList<>();
rootView.findViewsWithText(outputViews, "MyTag", FIND_VIEWS_WITH_CONTENT_DESCRIPTION); 

【讨论】:

  • 完美。工作真棒。比公认的答案小而更好的方法..
  • 这应该是可以接受的答案,简单易行;但要注意本地化可能会改变 contentDescription
  • 不好! ContentDescription 用于可访问性。使用android:tagview.setTag() 见上文accepted answer
【解决方案2】:

给你:

private static ArrayList<View> getViewsByTag(ViewGroup root, String tag){
    ArrayList<View> views = new ArrayList<View>();
    final int childCount = root.getChildCount();
    for (int i = 0; i < childCount; i++) {
        final View child = root.getChildAt(i);
        if (child instanceof ViewGroup) {
            views.addAll(getViewsByTag((ViewGroup) child, tag));
        }

        final Object tagObj = child.getTag();
        if (tagObj != null && tagObj.equals(tag)) {
            views.add(child);
        }

    }
    return views;
}

我已经在这里回答了:Android - how to find multiple views with common attribute

【讨论】:

  • 到底如何获得视图组?
  • @Shlomi Schwartz 为什么你没有在for loop 里面写if-else,就像if (child instanceof ViewGroup) views.addAll(getViewsByTag((ViewGroup) child, tag)) else { // check logic on view contain tag. } ==> 要检查ViewGroup 本身是否包含标签?
  • @KhaledLela 这是因为如果您这样做,结果将不包括具有您正在寻找的标签的视图组。它会隐式跳过它们,而只添加具有标签的叶子子节点。
【解决方案3】:

这个 API 调用 View#findViewWithTag 有帮助吗?请注意,它只返回一个视图...

查找具有给定标签的子视图。如果这个视图有给定的 标记,返回此视图。

【讨论】:

  • 不,它只返回带有该标签的第一个视图。
【解决方案4】:

一种方法是从父 ViewGroup 开始,遍历其子视图(及其子视图等),然后检查每个视图组的标签。

【讨论】:

  • 我可以通过删除地图视图中的所有叠加层来做到这一点。
  • 好吧,你从来没有在你的问题中提到MapView 和覆盖,是吗?我的回答是针对您的问题:Does anyone know how to retrieve a list of views with a given TAG?
猜你喜欢
  • 1970-01-01
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
相关资源
最近更新 更多