在运行时创建、存储和扩展自定义布局

Posted

技术标签:

【中文标题】在运行时创建、存储和扩展自定义布局【英文标题】:Create, store and inflate custom layout in runtime 【发布时间】:2011-07-30 01:20:54 【问题描述】:

我正在尝试为以下问题找到解决方案。我工作的应用程序需要用户能够通过自定义 UI 构建器生成自定义 UI(简单小部件的布局)。因此,用户可以在画布上堆叠小部件(主要是图像。但 TextViews 和 EditText),移动它们等。 UI 必须存储在数据库中以备将来使用。所以,应该有一些机制来加载和膨胀这个 UI。这是主要问题。

我的第一个想法是依赖标准的 android 布局机制。不幸的是,LayoutInflater 与编译成二进制形式的 XML 一起工作。据我所知,在运行时不可能将 XML 字符串编译成二进制表示。

有没有人遇到过这样的问题?有什么建议?

【问题讨论】:

Building/using runtime generated layout XML in Android 的可能重复项 考虑到您将在编辑器中实现一些布局功能的子集,无论如何滚动您自己的表示可能是有意义的。 【参考方案1】:

查看LayoutInflater 的膨胀方法。实际上,您可以给它任何XmlPullParser 作为它的源,而它又可以在给定任何Reader 的情况下构造。

换句话说,您几乎可以使用任何字符流作为 xml 源进行膨胀。

XmlPullParser 文档的开头为您提供了创建拉解析器的基本大纲:

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp = factory.newPullParser();
xpp.setInput(new StringReader("<foo>Hello World!</foo>"));

更新 - 如LayoutInflater 文档中所述,这将不起作用。

【讨论】:

这实际上不适用于 xml 布局。如果你将一个简单的 XML 传递给 XmlPullParser,然后尝试调用 inflater.inflate(xpp, null) 方法,它会抛出一个异常 原因是 - LayoutInflater 本身使用 XmlBlock.Parser,这是一个创建用于处理来自 xml 布局的二进制文件的解析器。而 XmlPullParserFactory 创建一个简单的 org.kxml2.io.KXmlParser 的实例 我的立场是正确的!谢谢你指出这一点。然后,这是 ***.com/questions/1942104/… 的副本 是的,好像是重复的。奇怪的是没有可用的工具来从字符串膨胀布局......即使性能不好,那又怎样?.. 然后用 Java 做。解析 XML,然后创建具有所需属性的必要视图。然后让我们知道它的表现;)

以上是关于在运行时创建、存储和扩展自定义布局的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UITableViewCell 的自动布局约束在运行时失败

Android:如何根据大小创建自定义布局

基于控件可见性在运行时自定义动态布局

如何创建具有自定义布局的模态底页?

集合视图,具有自定义布局,单元格在滚动时行为不端

自定义组合控件