Get root view from current activity
我知道如何使用View.getRootView()获取根视图。 我也能从按钮的onClick事件中获取视图,其中参数是View。 但是如何在活动中获取视图?
-
在活动中,通常使用setContentView()告诉它应该呈现哪个资源,并且您提供的视图已经是根。 如果您需要该视图的句柄,只需在XAML中为其添加一个ID,findViewById()即可。
-
我的计划是动态附加代码..所以如果我的用户使用api我希望它能自动检测到东西......博尔德的解决方案有效!
-
@xandy:一个小错字:XAML - > XML。
如果您需要您的活动的根视图(因此您可以在那里添加您的内容)使用
1
| findViewById(android.R.id.content) |
另据报道,在某些设备上你必须使用
1
| getWindow().getDecorView().findViewById(android.R.id.content) |
代替。
请注意,正如Booger报道的那样,这可能在某些设备上的导航栏(带后退按钮等)后面(但在大多数设备上似乎不是这样)。
如果您需要使用setContentView()方法获取添加到活动中的视图,那么就像pottedmeat写的那样,您可以使用
1 2
| final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
.findViewById(android.R.id.content)).getChildAt(0); |
但最好只在xml布局中将id设置为此视图并改为使用此id。
-
实际上只是findViewById(android.R.id.content)给了我根视图。如果在某些情况下不成立,我可以从findViewById(android.R.id.content).getRootView()获得root视图。谢谢你的回答。我在哪里可以了解更多关于android.R的东西?我没有意识到这一点。
-
你可以在这里查看我想developer.android.com/reference/android/R.html这只是android资源参考。我亲自了解了android.R.id.content,然后检查了hierarchyviewer中的布局。
-
我注意到此视图似乎包含状态栏,因此如果您正在查找活动的可见部分,请使用@pottedmeat中的答案。
-
@Lalith,你能详细说明你何时需要做findViewById(android.R.id.content).getRootView()?一般规则对于了解非常有用。
-
@batbrat我需要在使用操作栏时在Android 5.0+中使用.getRootView()
-
当您使用此答案时,您的Snackbar将包含系统装饰(意味着Snackbar信息将显示在导航按钮后面 - Home / Back / Recents)。我需要我的Snackbar出现在MY Activity中(不是整个系统,包括屏幕上的导航按钮),所以请使用另一个答案。
-
@ nickes,如何获取片段的rootview?
-
@VikramSingh在Fragment中调用getView()。
-
@batbrat:IIRC,如果您已经拥有根视图,view.getRootView()将返回该根视图(再次)。我的意思是,添加.getRootView()是无害的,所以安全的答案是始终执行findViewById(android.R.id.content).getRootView()。 [除非你想要内容的根,否则.getChildAt(0)就是你想要的。]
-
activity.findViewById(android.R.id.content)在Android 5中返回null :(
-
@JuanJosé MeleroGó mez所有Android 5设备是否一致,还是只适用于您的设备?
-
你是对的,@ DmitryRyadnenko,它只发生在我的设备上。这是三星SM-T365。我必须使用getWindow().getDecorView()。
这是我用来获取在setContentView指定的XML文件中找到的根视图:
1 2
| final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
.findViewById(android.R.id.content)).getChildAt(0); |
-
这个答案给出了没有状态栏的视图 - 这就是我想要的。我一直在寻找活动可见部分的像素宽度+高度。这个工作,谢谢!
-
这不包括ActionBar!
-
有没有办法包含ActionBar?
-
这里的关键词是"XML文件中的根视图"。谢谢。
-
这应该是正确的标记答案。这将把Snackbar放在你的Activity(在根目录)里面,这应该是它的位置(我很确定没有人想把它们的信息放在Nav Buttons之后)
-
为什么使用getChildAt(0)?任何人?
-
findViewById(android.R.id.content).getHeight();将为您提供根视图的高度
我在android 4.0.3中测试过这个,只有:
1
| getWindow().getDecorView().getRootView() |
给出我们得到的相同的观点
1 2 3
| anyview.getRootView();
com.android.internal.policy.impl.PhoneWindow$DecorView@######### |
和
1
| getWindow().getDecorView().findViewById(android.R.id.content) |
给孩子的
1
| android.widget.FrameLayout@####### |
请确认。
-
Android2.3.3似乎一样
-
在4.3中工作是我发现的最简单的方法和最少量的代码。
-
也适用于Android 4.4。
-
最好的,如果你使用SnackBar
-
getWindow()。getDecorView()。getRootView()。getHeight()返回显示高度。
-
getWindow()。getDecorView()。getRootView()不推荐用于小吃店,它会重叠系统导航栏,findViewById(android.R.id.content)会更好。
从当前活动中获取根视图。
在我们的活动中,我们可以获得root视图:
1 2
| ViewGroup rootView = (ViewGroup) ((ViewGroup) this
.findViewById(android.R.id.content)).getChildAt(0); |
要么
1
| View rootView = getWindow().getDecorView().getRootView(); |
只是因为有人需要一种更简单的方法:
以下代码提供了整个活动的视图:
View v1 = getWindow().getDecorView().getRootView();
要在活动中获取certian视图,例如活动中的imageView,只需添加您想要获取的视图的ID:
1
| View v1 = getWindow().getDecorView().getRootView().findViewById(R.id.imageView1); |
希望这有助于某人
-
如果您想要特定视图,可以在活动上调用findViewById(R.id.imageView1);。
在Kotlin,我们可以做得更短一些:
1
| val rootView = window.decorView.rootView |
anyview.getRootView();将是最简单的方法。
获取当前活动的视图
在任何onClick我们将获得"查看视图",通过使用'view'获取rootView。
View view = view.getRootView();
并获取片段中的视图
View view = FragmentClass.getView();
如果你在一个活动中,假设只有一个根视图,你可以像这样得到它。
1 2
| ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
.findViewById(android.R.id.content)).getChildAt(0); |
然后你可以将它投射到真正的课堂上
或者你可以使用
1
| getWindow().getDecorView(); |
请注意,这将包括操作栏视图,您的视图位于操作栏视图下方