53

该类Activity有一个setContentView()方法。该类PopupWindow有一个getContentView()方法,但没有其他方法。是否有另一种方法来获取活动的主要内容视图?

4

3 回答 3

52

通过此调用,我能够访问 Activity 的内容:

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

您可能应该检查 getDecorView 是否在所有情况下都返回一个 instanceof ViewGroup,但是在 Activity 中使用 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 + " ");
    }
}

您可以在 Activity 中使用以下调用遍历所有视图并记录它们的类名:

logContentView(getWindow().getDecorView(), "");
于 2010-11-21T20:45:28.070 回答
52

以下行将解决问题:

findViewById(android.R.id.content);

它本质上是相同的(它需要在一个活动的上下文中调用)

this.findViewById(android.R.id.content);
于 2013-01-07T05:42:11.203 回答
3

我也在寻找这个,但我只是认为将 id 添加到最外层的 ViewGroup 可能更容易。

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

于 2010-11-21T05:52:59.423 回答