【问题标题】:how do I find complete view hierarchy of android activity in a programmatic way (code)?如何以编程方式(代码)找到 android 活动的完整视图层次结构?
【发布时间】:2015-10-17 03:47:36
【问题描述】:

我正在编写一个模块来检测当前正在运行的 Android 活动,并完成有关该活动的视图树的信息。

我了解 Android 框架布局和绘制视图。我在哪里可以找到诸如当前在屏幕上可见的视图及其位置等信息?

我尝试如下使用反射。但它总是返回空的视图集。有没有人指点一下如何做到这一点?

try {
  String windowManagerClassName;
  if (android.os.Build.VERSION.SDK_INT >= 17) {
    windowManagerClassName = "android.view.WindowManagerGlobal";
  } else {
    windowManagerClassName = "android.view.WindowManagerImpl";
  }
  windowManager = Class.forName(windowManagerClassName);
} catch (ClassNotFoundException e) {
  throw new RuntimeException(e);
} catch (SecurityException e) {
  throw new RuntimeException(e);
}
Field views;
Field instanceField;
try {
  views = windowManager.getDeclaredField("mViews");
  instanceField = windowManager.getDeclaredField(getWindowManagerString());
  views.setAccessible(true);
  instanceField.setAccessible(true);
  Object instance = instanceField.get(null);
  synchronized (windowManager) {
    if (android.os.Build.VERSION.SDK_INT <= 18) {
      return new HashSet<View>(Arrays.asList(((View[]) views.get(instance))));
  }
}
...

【问题讨论】:

  • 那些是外部工具。我正在寻找编程方式(代码)来获取我的应用程序中的信息。你有代码sn-p的指针吗?

标签: android user-interface


【解决方案1】:

对于外部工具,我建议在 android 设备监视器中使用 Hierarchy View 工具。

[编辑] 如果您希望以编程方式进行。尝试获取根视图并递归遍历子视图。

【讨论】:

  • 那些是外部工具。我正在寻找编程方式(代码)来获取我的应用程序中的信息。你有代码sn-p的指针吗?
【解决方案2】:

使用hierarchyviewer查看视图层次结构中的所有视图

工具可以在android sdk .../sdk/tools/hierarchyviewer中找到

【讨论】:

  • 那些是外部工具。我正在寻找程序化方式(代码)来获取我的应用程序中的信息。你有代码sn-p的指针吗?
【解决方案3】:

您也可以尝试 sdk/tools 文件夹下的uiautomatorviewer

它允许使用鼠标指针导航设备/模拟器上显示的活动布局。

【讨论】:

  • 那些是外部工具。我正在寻找编程方式(代码)来获取我的应用程序中的信息。你有代码sn-p的指针吗?
【解决方案4】:

您可以尝试根据相关问题的答案编写自定义 LayoutInflator:


这是一篇博客文章,其中包含一些有趣的东西 - 一个自定义布局充气器,可以拦截所有视图膨胀:

也许可以使用该示例代码来拦截 inflate 调用,并接收 XML 文件的 资源 ID


这是一个长镜头,但它使您可以访问正在膨胀的 XML 文件。直到我看到之前那篇促使我做一些研究的帖子,我才意识到你可以做到这一点。

【讨论】:

    猜你喜欢
    • 2015-05-21
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 2012-10-07
    • 2016-01-22
    • 1970-01-01
    • 2014-01-02
    • 2016-11-10
    相关资源
    最近更新 更多