web-dev-qa-db-ja.com

アクティビティにgetContentView()メソッドがないのはなぜですか?

ActivityクラスにはsetContentView()メソッドがあります。 PopupWindowクラスにはgetContentView()メソッドがありますが、他には何もありません。アクティビティのメインコンテンツビューを取得する別の方法はありますか?

51
kencorbin

この呼び出しでアクティビティのコンテンツにアクセスできました:

ViewGroup view = (ViewGroup)getWindow().getDecorView();

おそらくgetDecorViewがすべての場合にViewGroupのインスタンスを返すことを確認する必要がありますが、アクティビティのLinearLayoutを使用すると、上記のコードは正常に実行されます。 LinearLayoutを取得するには、次のようにします。

LinearLayout content = (LinearLayout)view.getChildAt(0);

そして、次のような関数がある場合:

void logContentView(View parent, String indent) {
    Log.i("test", indent + parent.getClass().getName());
    if (parent instanceof ViewGroup) {
        ViewGroup group = (ViewGroup)parent;
        for (int i = 0; i < group.getChildCount(); i++)
            logContentView(group.getChildAt(i), indent + " ");
    }
}

すべてのビューを反復処理し、アクティビティ内で次の呼び出しを使用してクラス名を記録できます。

logContentView(getWindow().getDecorView(), "");
51
mikeplate

次の行がトリックを行います:

findViewById(Android.R.id.content);

それは本質的に同じです(アクティビティのコンテキストで呼び出す必要があります)

this.findViewById(Android.R.id.content);
50
moonlightdock

私もこれを探していますが、最も外側のViewGroupにidを追加する方が簡単かもしれないと思っただけです。

<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent" 
    Android:layout_height="fill_parent" 
    Android:id="@+id/outer">
    <LinearLayout 
        Android:layout_width="fill_parent" 
        Android:layout_height="fill_parent">

しかし、私はさらに数分間探し続けます。一番外側のレイアウトから findViewWithTag を使用できるように、私はそれに夢中です。

3
bibby