web-dev-qa-db-ja.com

Androidビューのすべてのサブビューをループしますか?

私はAndroid用のゲームに取り組んでいます。それを実装するのを助けるために、私の考えはビューのサブクラスを作成することです。次に、このクラスのいくつかのインスタンスをメインビューの子として挿入します。各インスタンスは、(OnTouchListenerを介して)押されたときの検出を処理します。

私が今抱えている問題は、これらすべてのサブビューをループして、それらのステータスを読み取って処理できるようにする方法です。 (つまり、すべてが特定の状態に達すると、何かが発生するはずです)。

または、タッチに応答し、ステータスを確認できる複数のオブジェクトを画面に表示するためのより良い方法はありますか?

31
Slapout

@jqpubliqは正しいですが、本当にすべてのビューを確認したい場合は、ViewGroupgetChildCount()メソッドとgetChildAt()メソッドを使用できます。残りは単純な再帰メソッドで行います。

20
Romain Guy

再帰関数の小さな例を作成しました。

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の場合、その子で関数を再起動して、その中のすべてのネストされたビューを取得します子。

54
Tobrun

Viewsを使用すると、動きがある場合に何かをうまくレンダリングするのが非常に困難になるようです。本当に静的なことをしているのでない限り、おそらくCanvasに描画するか、OpenGLを使用することをお勧めします。これが 素晴らしい話 昨年のI/O会議でのAndroidゲームの作成に関するものです。長いので、約15分スキップできます。ソースも利用できます。 。それはあなたに物事を進める方法の良いアイデアを与えるはずです

1
jqpubliq

代替案

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