如何获取 Activity 中的所有视图?

17

有没有办法获取我的活动中的每个视图?我有超过200个视图,包括按钮和图片,所以我想通过使用循环来访问它们。

例如,像下面这样:

for (View v : this)
{
     //do something with the views 
     //depending on the types (button, image , etc)
}
5个回答

30

有没有一种方法可以获取活动中的每个视图?

获取您的根 View,将其转换为 ViewGroup,调用 getChildCount()getChildAt(),并根据需要递归。

我有超过200个视图,包括按钮和图像,所以我希望能够使用循环访问它们

这是一个相当大的 Views 数量。


1
非常感谢,完美。 一个看不见的对象(按钮)挡住了我的整个屏幕,我使用这个方法找出是哪个项目在阻塞并找到了它 :) - aryaxt
7
SDK自带的hierarchyviewer工具可以帮助你找到这样的问题。它可以将你的应用程序的视图层次结构以树形图的方式可视化显示,让你检查每个视图的属性。 - adamp
1
我知道,但大多数对象都是通过代码添加到屏幕上的。 - aryaxt

12

具体来说:

private void show_children(View v) {
    ViewGroup viewgroup=(ViewGroup)v;
    for (int i=0;i<viewgroup.getChildCount();i++) {
        View v1=viewgroup.getChildAt(i);
        if (v1 instanceof ViewGroup) show_children(v1);
        Log.d("APPNAME",v1.toString());
    }
}

然后在某个地方使用该函数:

show_children(getWindow().getDecorView());

显示当前 Activity 中的所有视图。


2
尝试查找与Activity相关的所有视图。
给出以下命令。
ViewGroup viewgroup=(ViewGroup)view.getParent();
viewgroup.getchildcount();

循环遍历。

我们将获得结果。


1

用 Kotlin 递归地完成这个任务的好方法:

private fun View.getAllViews(): List<View> {
    if (this !is ViewGroup || childCount == 0) return listOf(this)

    return children
            .toList()
            .flatMap { it.getAllViews() }
            .plus(this as View)
}

0

你可以使用HierarchyViewer,它允许你查看包括在代码中创建的视图层次结构。它的主要目的是用于调试此类问题。最新的Android Studio现在在设备监视器中具有此功能,可让您对UI进行转储以进行调试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接