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

循环浏览Android视图的所有子视图?,android,view,viewgroup,android-viewgroup,Android,View,Viewgroup,Android Viewgroup,我正在为Android开发一款游戏。为了帮助实现它,我的想法是创建一个视图的子类。然后,我将插入这个类的几个实例作为主视图的子对象。每个实例都将在按下时处理检测(通过OnTouchListener) 我现在遇到的问题是如何循环所有这些子视图,以便读取它们的状态并处理它们?(也就是说,当他们都达到某个特定的状态时,就会发生一些事情) 或者,有没有更好的方法让屏幕上的多个对象对触摸做出响应,我可以检查它们的状态?使用视图听起来,如果有移动,渲染任何东西都会非常困难。您可能希望在画布上绘制,或者使用O

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

我现在遇到的问题是如何循环所有这些子视图,以便读取它们的状态并处理它们?(也就是说,当他们都达到某个特定的状态时,就会发生一些事情)


或者,有没有更好的方法让屏幕上的多个对象对触摸做出响应,我可以检查它们的状态?

使用
视图
听起来,如果有移动,渲染任何东西都会非常困难。您可能希望在
画布上绘制,或者使用
OpenGL
,除非您正在做一些真正静态的工作。这是去年关于制作Android游戏的I/O会议的一篇文章。它有点长,你可以跳过大约15分钟。此外,该来源是可用的。这应该会让你对处理事情的方法有一个很好的想法

@jqpubliq是正确的,但是如果你真的想浏览所有视图,你只需使用
ViewGroup
中的
getChildCount()
getChildAt()
方法即可。一个简单的递归方法将完成剩下的工作。

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

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
                }
            }
        }
    }
public void recursiveLoopChildren(视图组父级){
对于(int i=0;i
该函数将开始在
视图组中的所有视图元素上循环(从第一项到最后一项),如果子视图组是
视图组
,则使用该子视图重新启动该函数以检索该子视图中的所有嵌套视图。

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
    }

}
publicstaticvoid递归查找子对象(视图){
if(视图组的视图实例){
//视图组
ViewGroup ViewGroup=(ViewGroup)视图;
对于(int i=0;i
或者,您可以返回您可以使用下一种方法的内容

@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;
}
@Nullable
私有静态WebView递归查找WebView(视图){
if(视图组的视图实例){
//视图组
ViewGroup ViewGroup=(ViewGroup)视图;
如果(!(WebView的视图组实例)){
对于(int i=0;i
试试这个。获取父布局中的所有视图并返回视图的数组列表

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;
    }
公共列表GetAllView(视图组布局){
列表视图=新建ArrayList();
对于(int i=0;i
是的,我让你需要用不同的方式来做,但我要先试试这个。这是一个随意的游戏。你为什么选择
作为(int i=parent.getChildCount()-1;i>=0;i--)而不是
作为(int i=0;i
?@PeterProkop我个人更喜欢这个循环。在循环过程中,即使您删除了循环的一个元素,它也能正常工作。@Karacago WebView是一个视图组,因此您可以在
if(ViewGroup的子实例)之前添加
if(WebView的子实例)
条件。