循环浏览Android视图的所有子视图?

时间:2010-04-08 02:36:51

标签: android view viewgroup android-viewgroup

我正在为Android开发游戏。为了帮助实现它,我的想法是创建一个视图的子类。然后我会插入此类的几个实例作为主视图的子项。每个实例都会处理它被按下的时间(通过OnTouchListener)。

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

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

5 个答案:

答案 0 :(得分:53)

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

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,那么用该子节点重新启动该函数以检索内部的所有嵌套视图那个孩子。

答案 1 :(得分:20)

@jqpubliq是对的,但如果你真的想要查看所有视图,只需使用getChildCount()中的getChildAt()ViewGroup方法即可。一个简单的递归方法将完成其余的工作。

答案 2 :(得分:1)

使用Views听起来如果有动作就会很难渲染任何东西。您可能希望绘制到Canvas或使用OpenGL,除非您正在做一些非常静态的事情。这是去年I / O会议制作Android游戏的great talk。它很长,你可以跳过大约15分钟。还有来源可用。这应该会让你很好地了解如何处理事情

答案 3 :(得分:0)

替代

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;
}

答案 4 :(得分:0)

尝试一下。在父级布局中获取所有视图,并返回视图的数组列表。

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;
    }