从当前活动中获取根视图

Lal*_*ith 604 android view android-activity

我知道如何使用View.getRootView()获取根视图.我也能从一个按钮的onClick事件中获取视图,其中参数是一个视图.但是如何在活动中获取视图

Dmi*_*nko 1003

如果您需要您的活动的根视图(因此您可以在那里添加您的内容)使用

findViewById(android.R.id.content).getRootView()
Run Code Online (Sandbox Code Playgroud)

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

getWindow().getDecorView().findViewById(android.R.id.content)
Run Code Online (Sandbox Code Playgroud)

代替.

请注意,正如Booger报道的那样,这可能在某些设备上的导航栏(带后退按钮等)后面(但在大多数设备上似乎不是这样).

如果您需要获取使用setContentView()方法添加到活动中的视图,那么就像pottedmeat写的那样,您可以使用

final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
            .findViewById(android.R.id.content)).getChildAt(0);
Run Code Online (Sandbox Code Playgroud)

但最好只在xml布局中将id设置为此视图并改为使用此id.

  • 实际上只是findViewById(android.R.id.content)给了我根视图.如果在某些情况下不是这样,我可以从findViewById(android.R.id.content).getRootView()获得root视图.谢谢你的回答.我在哪里可以了解更多关于android.R的东西?我没有意识到这一点. (191认同)
  • 我注意到此视图似乎包含状态栏,因此如果您正在查找活动的可见部分,请使用@pottedmeat中的答案. (14认同)
  • @Lalith,你能详细说明你何时需要做findViewById(android.R.id.content).getRootView()?一般规则对于了解非常有用. (5认同)
  • 你可以在这里查看我想http://developer.android.com/reference/android/R.html这只是android资源参考.我亲自了解了android.R.id.content,然后检查了hierarchyviewer中的布局. (4认同)
  • @batbrat我需要在使用操作栏时在Android 5.0+中使用.getRootView() (2认同)

pot*_*eat 259

这是我用来获取分配的XML文件中的根视图setContentView:

final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
            .findViewById(android.R.id.content)).getChildAt(0);
Run Code Online (Sandbox Code Playgroud)

  • 这个答案给出了没有状态栏的视图 - 这就是我想要的.我一直在寻找活动可见部分的像素宽度+高度.这个工作,谢谢! (32认同)
  • 这不包括ActionBar! (9认同)
  • 有没有办法包括`ActionBar`? (4认同)
  • 这里的关键词是"XML文件中的根视图".谢谢. (3认同)
  • 这应该是正确的标记答案.这将把Snackbar放在你的Activity(在根目录)里面,这应该是它的位置(我很确定没有人想把它们的信息放在Nav Buttons之后) (2认同)

Sud*_*lan 127

我在android 4.0.3中测试过这个,只有:

getWindow().getDecorView().getRootView()
Run Code Online (Sandbox Code Playgroud)

给出我们得到的相同的观点

anyview.getRootView();

com.android.internal.policy.impl.PhoneWindow$DecorView@#########
Run Code Online (Sandbox Code Playgroud)

getWindow().getDecorView().findViewById(android.R.id.content)
Run Code Online (Sandbox Code Playgroud)

给孩子的

android.widget.FrameLayout@#######
Run Code Online (Sandbox Code Playgroud)

请确认.

  • 最好的,如果你使用SnackBar (10认同)
  • Android2.3.3似乎一样 (5认同)
  • 小吃店不建议使用getWindow()。getDecorView()。getRootView(),它将与系统导航栏重叠,findViewById(android.R.id.content)会更好。 (3认同)
  • 在4.3中工作是我发现的最简单的方法和最少量的代码. (2认同)

Jor*_*sys 30

从当前活动中获取根视图.

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

ViewGroup rootView = (ViewGroup) ((ViewGroup) this
            .findViewById(android.R.id.content)).getChildAt(0);
Run Code Online (Sandbox Code Playgroud)

要么

View rootView = getWindow().getDecorView().getRootView();
Run Code Online (Sandbox Code Playgroud)


小智 17

只是因为有人需要一种更简单的方法:

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

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

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

View v1 = getWindow().getDecorView().getRootView().findViewById(R.id.imageView1);
Run Code Online (Sandbox Code Playgroud)

希望这有助于某人

  • 如果你想要特定的视图,你可以在活动上调用`findViewById(R.id.imageView1);`. (5认同)

Art*_*nev 16

在Kotlin,我们可以做得更短一些:

val rootView = window.decorView.rootView
Run Code Online (Sandbox Code Playgroud)

  • 它,获取 Windows 的根,如果你显示小吃,它会在导航栏中显示消息 (2认同)

Ale*_*amo 8

对于那些使用数据绑定库的人来说,要获取当前活动的根,只需使用:

View rootView = dataBinding.getRoot();
Run Code Online (Sandbox Code Playgroud)

对于 Kotlin 用户来说,这就更简单了:

val rootView = dataBinding.root
Run Code Online (Sandbox Code Playgroud)


Gib*_*olt 7

Kotlin 扩展解决方案

使用它来简化活动中的访问。那么你可以直接rootView从Activity中引用,或者activity.rootView在它之外引用:

val Activity.rootView get() = window.decorView.rootView
Run Code Online (Sandbox Code Playgroud)

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

val Fragment.rootView get() = view?.rootView
Run Code Online (Sandbox Code Playgroud)


Khe*_*raj 5

anyview.getRootView();将是最简单的方法。