ChatGPT解决这个技术问题 Extra ChatGPT

从当前活动中获取根视图

我知道如何使用 View.getRootView() 获取根视图。我还可以从参数为 View 的按钮的 onClick 事件中获取视图。但是我怎样才能在 activity 中获得 view

在活动中,通常您使用 setContentView() 告诉它应该呈现哪个资源,并且您提供的视图已经是根。如果您需要该视图的句柄,只需在 XAML 中为其添加一个 ID,findViewById() 就可以了。
我的计划是动态附加代码..所以如果我的用户使用 api 我希望它能够自动检测到东西.. Boulder 的解决方案有效!
@xandy:一个轻微的错字:XAML -> XML。

G
Googlian

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

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


实际上只是 findViewById(android.R.id.content) 给了我根视图。如果在某些情况下不是这样,我可以从 findViewById(android.R.id.content).getRootView() 获取根视图。感谢你的回答。我在哪里可以了解有关 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()
J
Jared Burrows

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

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

这个答案给出了没有状态栏的视图——这就是我想要的。我正在寻找活动可见部分的像素宽度+高度。这个有效,谢谢!
这不包括 ActionBar!
有没有办法也包括 ActionBar
这里的关键词是“在 XML 文件中找到的根视图”。谢谢你。
这应该是正确的标记答案。这会将 Snackbar 放置在您的 Activity 中(在根目录下),这就是它应该在的位置(我很确定没有人愿意将他们的信息放在导航按钮后面)
S
Sudar Nimalan

我在 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@#######

请确认。


Android2.3.3好像一样
在 4.3 中工作是我发现的最简单的方法和最少的代码量。
最好使用 SnackBar
getWindow().getDecorView().getRootView().getHeight() 返回显示高度。
小吃店不推荐getWindow().getDecorView().getRootView(),会和系统导航栏重叠,findViewById(android.R.id.content)会更好。
C
Community

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

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

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

或者

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

A
Artem Botnev

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

val rootView = window.decorView.rootView

它,取windows的根,如果你显示一个小吃它会在导航栏中显示消息
S
Salah Klein

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

下面的代码给出了整个活动的视图:

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

要在活动中获取特定视图,例如活动中的 imageView,只需添加要获取的视图的 id:

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

希望这可以帮助某人


如果您想要特定的视图,您可以在 Activity 上调用 findViewById(R.id.imageView1);
G
Gibolt

Kotlin 扩展解决方案

使用它来简化 Activity 中的访问。然后您可以直接从 Activity 中引用 rootView,或者在它之外引用 activity.rootView

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

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

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

A
Alex Mamo

对于使用 Data Binding Library 的人,要获取当前活动的根,只需使用:

View rootView = dataBinding.getRoot();

对于 Kotlin 用户来说,它甚至更简单:

val rootView = dataBinding.root

我认为这应该被赞成,特别是现在数据绑定是支持使用视图的库。数据绑定让这个过程变得简单多了!
A
Arnaud

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


u
user3509903

获取当前活动的视图

在任何 onClick 中,我们将获得“视图视图”,通过使用“视图”获取 rootView。

视图视图 = view.getRootView();

并在片段中获取视图

视图视图 = FragmentClass.getView();


s
smac89

另一个 Kotlin 扩展解决方案

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

android:id="@+id/root_activity"

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

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

您现在可以使用 root_activity 作为视图。


b
bowman han

如果你在一个活动中,假设只有一个根视图,你可以像这样得到它。

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

然后你可以把它投射到你真正的班级

或者你可以使用

getWindow().getDecorView();

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


Activity 类中没有这样的方法。
window.decorView 或 window.decorView 作为 ViewGroup - 如果您需要将其转换为 ViewGroup