在 Android 中构建/使用运行时生成的布局 XML

Posted

技术标签:

【中文标题】在 Android 中构建/使用运行时生成的布局 XML【英文标题】:Building/using runtime generated layout XML in Android 【发布时间】:2010-12-28 20:45:38 【问题描述】:

我目前正在从事一个项目,该项目需要我使用 XML 文档在 android 设备上呈现表单。表单必须在运行时获取并显示。我想知道是否有办法标记表单 XML,使用 XSLT 将其转换为 Android 布局 XML,然后让设备呈现它。

【问题讨论】:

请注意。 Android 做了很多工作来优化运行时对这些文件的读取和解析。因此,如果您自己滚动,请准备好让它膨胀得慢很多。 【参考方案1】:

不幸的是,你不能只克隆 LayoutInflater 或使用其他类似的技巧来做到这一点——布局膨胀完全依赖于带有 AttributeSet 参数的视图构造函数,它完全依赖于 Context.obtainStyledAttributes 方法,它本身就是完全依赖于预处理二进制 XML 文件才能进行合理有效的属性解析。

您可以探索的另一种方法是在您的服务器上使用 aapt 工具(或更可能是它的黑客版本),将您生成的布局编译成适当的数据。不幸的是,我们目前没有办法从原始二进制 blob 构造 XmlPullParser(它必须从 AssetManager 获取这个 blob),因此使用这种方法在客户端和服务器上都有相当多的工作要做。我怀疑有人可以想出一些非常简洁的东西,但这将是很多工作。

【讨论】:

考虑到这是需要在接下来的一周半内制作原型的东西,我认为这不是我应该在以后研究的方法。你同意吗?我之前已经在运行时为桌面和 Web 平台构建了基于 XML 的 UI。我们还有一个用于 Windows Mobile 应用程序的实现。我可能只需要模仿这些方法,稍后当我有更多时间或出现性能问题时进行调查。 是的,这不是一个一周的项目。 :) 最简单的方法是创建一个简单的 XML 结构来定义您的布局所需的内容,而不是尝试允许 Android 布局可以做的所有可能的事情。解析它并将其转换为 View 布局的构造应该相当简单;您可以根据需要向 XML 格式添加新功能。【参考方案2】:

Android 仅包含一种内置方式来“膨胀”作为布局资源存储在 APK 文件中的布局 XML。如果您想从其他来源“膨胀”相似(或不同)的 XML,您必须自己实现,可能通过从 LayoutInflater 类中克隆一些逻辑。

【讨论】:

【参考方案3】:

LayoutInflater.inflate 方法将 XmlPullParser 作为参数,因此您只需将动态创建的 XML 加载到 PullParser 并将其传递到充气器。

【讨论】:

但是,如果您真的阅读了该方法的文档,它会说“目前无法在运行时在纯 XML 文件上使用带有 XmlPullParser 的 LayoutInflater”。 这很糟糕,我可以看到这是一个非常简洁的功能。

以上是关于在 Android 中构建/使用运行时生成的布局 XML的主要内容,如果未能解决你的问题,请参考以下文章

Android:从运行时生成的文本字段中将数据保存到Firebase

findViewById 返回 null - Android - setContentView

生成 APK 但未构建和部署时构建失败

如何在运行时在android中切换布局?

尝试运行基本活动时生成错误

使用 Android Studio 构建简单的用户界面