Loop through all subviews of an Android view?

后端 未结 5 1400
北荒
北荒 2020-12-08 04:48

I’m working on a game for Android. To help implement it, my idea is to create a subclass of a view. I would then insert several instances of this class as children of the ma

相关标签:
5条回答
  • 2020-12-08 05:17

    I have made a small example of a recursive function:

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

    The function will start looping over al view elements inside a ViewGroup (from first to last item), if a child is a ViewGroup then restart the function with that child to retrieve all nested views inside that child.

    0 讨论(0)
  • 2020-12-08 05:21

    The alternative

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

    Or you can return something you can use the next approach

    @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;
    }
    
    0 讨论(0)
  • 2020-12-08 05:29

    Using Views sounds like its going to be brutally difficult to render anything well if there is movement. You probably want to be drawing to a Canvas or using OpenGL unless you're doing something really static. Here's a great talk from last years I/O conference on making Android games. Its kind of long and you can skip about 15 minutes in. Also the source is available. That should give you a good idea of ways to go about things

    0 讨论(0)
  • 2020-12-08 05:32

    @jqpubliq Is right but if you really want to go through all Views you can simply use the getChildCount() and getChildAt() methods from ViewGroup. A simple recursive method will do the rest.

    0 讨论(0)
  • 2020-12-08 05:34

    Try this. Takes all views inside a parent layout & returns an array list of views.

    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;
        }
    
    0 讨论(0)
提交回复
热议问题