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

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

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

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

【问题讨论】:

    标签: android view viewgroup android-viewgroup


    【解决方案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;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-02-05
          • 2018-04-17
          • 1970-01-01
          • 2014-09-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-19
          相关资源
          最近更新 更多