循环遍历Android视图的所有子视图?

Posted

技术标签:

【中文标题】循环遍历Android视图的所有子视图?【英文标题】:Loop through all subviews of an Android view? 【发布时间】:2011-02-05 12:51:21 【问题描述】:

我正在开发一款适用于 android 的游戏。为了帮助实现它,我的想法是创建一个视图的子类。然后我会插入这个类的几个实例作为主视图的子级。每个实例都会处理检测它何时被按下(通过 OnTouchListener)。

我现在遇到的问题是如何循环遍历所有这些子视图,以便读取它们的状态并进行处理? (即,当他们都达到某种状态时,应该发生一些事情)。

或者有没有更好的方法在屏幕上显示多个响应触摸的对象以及我可以检查它们的状态?

【问题讨论】:

【参考方案1】:

我做了一个递归函数的小例子:

public void recursiveLoopChildren(ViewGroup parent) 
        for (int i = 0; i < parent.getChildCount(); i++) 
            final View child = parent.getChildAt(i);
            if (child instanceof ViewGroup) 
                recursiveLoopChildren((ViewGroup) child);
                // DO SOMETHING WITH VIEWGROUP, AFTER CHILDREN HAS BEEN LOOPED
             else 
                if (child != null) 
                    // DO SOMETHING WITH VIEW
                
            
        
    

该函数将开始循环遍历 ViewGroup 内的所有视图元素(从第一项到最后一项),如果子项是 ViewGroup,则使用该子项重新启动该函数以检索该子项内的所有嵌套视图。

【讨论】:

您选择for (int i = parent.getChildCount() - 1; i &gt;= 0; i--)而不是for (int i = 0; i &lt; parent.getChildCount(); i++)的任何特殊原因? @PeterProkop 我个人更喜欢这个循环。即使在循环期间删除循环的元素之一,它也能正常工作。 @Karacago WebView 是一个 ViewGroup,因此您可以在if (child instanceof ViewGroup) 之前添加if (child instanceof WebView) 条件。【参考方案2】:

@jqpubliq 是对的,但如果你真的想浏览所有视图,你可以简单地使用来自 ViewGroupgetChildCount()getChildAt() 方法。一个简单的递归方法将完成剩下的工作。

【讨论】:

【参考方案3】:

试试这个。获取父布局中的所有视图并返回视图数组列表。

public List<View> getAllViews(ViewGroup layout)
        List<View> views = new ArrayList<>();
        for(int i =0; i< layout.getChildCount(); i++)
            views.add(layout.getChildAt(i));
        
        return views;
    

【讨论】:

【参考方案4】:

如果有运动,使用Views 听起来很难很好地渲染任何东西。您可能想要绘制到Canvas 或使用OpenGL,除非您正在做一些真正静态的事情。这是去年关于制作 Android 游戏的 I/O 会议的great talk。它有点长,你可以跳过大约 15 分钟。源代码也是可用的。这应该让你对做事的方法有一个很好的了解

【讨论】:

是的,我需要以不同的方式进行操作,但我要先尝试一下。这是一款休闲游戏。【参考方案5】:

另一种选择

public static void recursivelyFindChildren(View view) 
    if (view instanceof ViewGroup) 
        //ViewGroup
        ViewGroup viewGroup = (ViewGroup)view;

        for (int i = 0; i < viewGroup.getChildCount(); i++) 
            recursivelyFindChildren(viewGroup.getChildAt(i));
        

     else 
        //View
    


或者你可以返回一些你可以使用下一个方法的东西

@Nullable
private static WebView recursivelyFindWebView(View view) 
    if (view instanceof ViewGroup) 
        //ViewGroup
        ViewGroup viewGroup = (ViewGroup)view;

        if (!(viewGroup instanceof WebView)) 
            for (int i = 0; i < viewGroup.getChildCount(); i++) 
                WebView result = recursivelyFindWebView(viewGroup.getChildAt(i));

                if (result != null) 
                    return result;
                
            
         else 
            //WebView

            WebView webView = (WebView)viewGroup;
            return webView;
        

    

    return null;

【讨论】:

以上是关于循环遍历Android视图的所有子视图?的主要内容,如果未能解决你的问题,请参考以下文章

当有许多子视图时,如何使相对布局可滚动?

如何通过 android 中的回收器视图运行 for 循环?

Android 中通过Java代码动态生成EditText视图,并循环遍历EditText取出遍历的ID和文本框的值

Android 在一切之上叠加一个视图?

如何在android中直接获取所有子视图和hirechery

Android Kotlin - 用于 RecyclerView 的 setOnTouchListener 和所有项目子视图/里面的所有内容