从当前活动获取根视图


633

我知道如何使用View.getRootView()获得根视图。我也可以从按钮的onClick事件中获取视图,其中参数为View。但我怎么能得到视图中的活动


3
在活动中,通常您会告诉它应使用的资源,setContentView()并且提供的视图已经是根。如果需要该视图的句柄,只需在XAML中为其添加一个ID,findViewById()就可以了。
xandy 2010年

我的计划是动态附加代码。.因此,如果我的用户使用api,我希望它可以自动检测事物。.Boulder的解决方案有效!
拉利斯

4
@xandy:略有错别字:XAML-> XML。
superjos 2012年

Answers:


1048

如果您需要活动的根视图(以便可以在其中添加内容),请使用

findViewById(android.R.id.content).getRootView()

另外据报道,在某些设备上您必须使用

getWindow().getDecorView().findViewById(android.R.id.content)

代替。

请注意,正如Booger所报告的那样,这可能在某些设备上位于导航栏(带有后退按钮等)的后面(但在大多数设备上似乎并非如此)。

如果需要获取使用setContentView()方法添加到活动中的视图,则如pottedmeat所写,可以使用

final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
            .findViewById(android.R.id.content)).getChildAt(0);

但最好在xml布局中将此ID设置为此视图,并改用此ID。


194
实际上只是findViewById(android.R.id.content)给了我根视图。如果在某些情况下不是这样,我可以从findViewById(android.R.id.content).getRootView()获得根视图。感谢您的回答。在哪里可以了解有关android.R的更多信息?我没有意识到。
拉利斯

4
您可以在此处检查我是否认为developer.android.com/reference/android/R.html仅仅是android资源参考。我个人了解了android.R.id.content,然后在hierarchyviewer中检查了布局。
德米特里·里亚德

14
我注意到该视图似乎包含状态栏,因此,如果您正在寻找活动的可见部分,请使用@pottedmeat的答案。
Ben Clayton 2012年

5
@Lalith,能否详细说明何时需要执行findViewById(android.R.id.content).getRootView()?一条通则将非常有用。
batbrat 2014年

2
@batbrat使用动作栏时,我需要在Android 5.0+中使用.getRootView()
Morten Holmgaard 2015年

264

这是我用来获取在分配给XML文件中找到的根视图的方法setContentView

final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
            .findViewById(android.R.id.content)).getChildAt(0);

33
这个答案给出了没有状态栏的视图-这就是我想要的。我一直在寻找活动可见部分的像素宽度+高度。这个工程,谢谢!
本·克莱顿

9
这不包括ActionBar!
韦恩

4
有没有办法也包括在内ActionBar
theblang 2014年

3
这里的关键词是“在XML文件中找到的根视图”。谢谢。
凯西

3
这应该是正确的标记答案。这会将Snackbar放置在您的Activity(位于根目录中)的正确位置(我很确定没有人希望将其信息放置在Nav按钮后面)
Booger 2015年

136

我只在android 4.0.3中测试过:

getWindow().getDecorView().getRootView()

给出相同的看法

anyview.getRootView();

com.android.internal.policy.impl.PhoneWindow$DecorView@#########

getWindow().getDecorView().findViewById(android.R.id.content)

给它的孩子

android.widget.FrameLayout@#######

请确认。


5
Android2.3.3似乎相同
ruX

2
在4.3中工作是我发现的最简单的方法和最少的代码。
奥利弗·迪克森

10
最好,如果您使用的是SnackBar
zackygaurav,2015年

getWindow()。getDecorView()。getRootView()。getHeight()返回显示高度。
vovahost

3
小吃店不建议使用getWindow()。getDecorView()。getRootView(),它会与系统导航栏重叠,findViewById(android.R.id.content)会更好。
thanhbinh84 '17

31

从当前活动获取根视图。

在我们的活动中,我们可以通过以下方式获得root视图:

ViewGroup rootView = (ViewGroup) ((ViewGroup) this
            .findViewById(android.R.id.content)).getChildAt(0);

要么

View rootView = getWindow().getDecorView().getRootView();


19

万一有人需要一种更简单的方法:

以下代码提供了整个活动的视图:

View v1 = getWindow().getDecorView().getRootView();

要在活动中获取证书视图,例如活动中的imageView,只需添加要获取的视图的ID:

View v1 = getWindow().getDecorView().getRootView().findViewById(R.id.imageView1);

希望这对某人有帮助


5
findViewById(R.id.imageView1);如果需要特定的视图,则可以仅调用活动。
RobCo


2

Kotlin扩展解决方案

使用它来简化活动中的访问。然后,您可以直接rootView从“活动”中或activity.rootView外部进行引用:

val Activity.rootView get() = window.decorView.rootView

如果您想为Fragments添加相同的内容以保持一致性,请添加:

val Fragment.rootView get() = view?.rootView

1

获取当前活动的视图

在任何onClick中,我们都将使用“视图”获得rootView,从而获得“视图视图”。

视图view = view.getRootView();

并获得片段视图

视图view = FragmentClass.getView();


0

如果您处于活动中,则假定只有一个根视图,您可以像这样获得它。

ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
        .findViewById(android.R.id.content)).getChildAt(0);

然后可以将其投放到您的真实班级

或者你可以使用

getWindow().getDecorView();

请注意,这将包括操作栏视图,您的视图位于操作栏视图下方


Activity课堂上没有这样的方法。
onelaview

window.decorView或window.decorView作为ViewGroup-如果需要将其投射到ViewGroup
Edgar Khimich


0

另一个Kotlin Extension解决方案

如果您的活动视图是在xml(ex activity_root.xml)中声明的,请打开xml并为根视图分配一个ID:

android:id="@+id/root_activity"

现在在您的课程中,使用以下命令导入视图:

import kotlinx.android.synthetic.main.activity_root.root_activity

您现在可以root_activity用作视图。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.