【问题标题】:XML parser for dynamic layout (dynamically loaded skins)动态布局的 XML 解析器(动态加载的皮肤)
【发布时间】:2011-09-07 14:22:15
【问题描述】:

我想编写一个应用程序,其中(至少现在)内容始终相同,但布局是在运行时根据用户偏好动态加载的。本质上,我希望应用程序应用一个看起来与其他皮肤完全不同的“皮肤”。

我找到了一些使用 SAXparser 的教程: http://www.androidpeople.com/android-xml-parsing-tutorial-using-saxparser/ http://twigstechtips.blogspot.com/2010/12/android-how-to-parse-xml-string.html 并且可以想象从头开始编写能够识别所有标准 xml 布局标签然后动态加载布局的每个部分的东西。但从头开始需要做很多工作!这个功能肯定在 android 中可用,或者肯定有人编写了一些开源代码,可以在您的活动的 onCreate 方法开始时运行,该方法接受一个 xml 文件并设置您的布局?

我在这里发现了一个类似但回答不令人满意的问题: How to create a layout file programmatically 这让我认为,由于 setContentView 必须将整数 resourceID 作为其参数,因此这些在编译时预先烘焙的事实可能是一个问题。 (setContentView 也可以将 View 对象作为其参数,但我不想要大量的 if 语句并将每个 View 对象一个一个地传递给它,我想要一些输入 xml 文件或 xml 字符串并设置内容的代码查看。)

也许我偏离了轨道。还有另一种方法可以做到这一点吗?我认为拥有动态加载皮肤的应用程序的能力很重要。

谢谢!

【问题讨论】:

  • 注意,我不想在编译时包含 xml 文件。相反,想象一下 Web 上的一个 xml 文件,一个已编译的应用程序获取并用作它的皮肤。

标签: android


【解决方案1】:

我有类似的要求并尝试了相同的方法 - 它不起作用。

文档清楚地说明了这一点:http://developer.android.com/reference/android/view/LayoutInflater.html

更新:

由于 OP 需要加载在运行时创建的 XML 布局:

这可以通过创建 XML 布局文件、将它们复制到虚拟项目、创建 .apk 然后将 apk 加载到设备上来完成。

DexClassLoader 然后可用于在 apk 中加载类。

【讨论】:

  • 嗯,您似乎是对的(在您发送的链接中,我正在查看以“出于性能原因,...”开头的行
  • 完全正确 - 性能原因。布局充气机使用了很多。基本上,UI 的每一个和平都是通过 LayoutInflater 构建的。似乎他们在构建时预处理/预编译所有 UI XML。
  • 但是,我可以制作一个默认布局,它只是无聊的列表视图和黑白文本视图和按钮等,然后像平常一样编译。然后再回来应用一个皮肤,它使用所有相同的元素,但添加了各种疯狂的东西,比如虎皮背景图像?我认为这是完全可能的,但是它依赖于在编译后解析 xml 文件,然后动态获取 xml 文件中的每个标签并将其应用于您的布局.. 以更改颜色、大小、背景图像、位置等。我希望有人有一些我可以使用的黑盒代码来做到这一点
  • 您可以根据需要包含任意数量的布局 XML 或主题/样式,并在它们之间随意切换。你只是不能在运行时加载一个新的。它必须在编译时可用。
  • 所以基本上你不能在服务器上创建主题或布局,通过网络加载并使用它们。
【解决方案2】:

好吧,android 为您完成了艰苦的工作,但并不是所有的工作......

首先,你必须忘记解析 xml 布局......相反,你可以制作骨架布局,管理他的内部孩子的位置、大小等......然后用 LayoutInflater 膨胀那个“骨架”xml 并获得一个查看实例...

当您拥有该 View 实例后,您可以使用它做您想做的事,应用用户偏好,例如背景、前景颜色、位置、大小等...

也许我不明白你的问题,但你可以在编译时从 xml 资源中获取任何视图,然后应用其他样式或设置其他属性

【讨论】:

  • 感谢您的回答。但是,假设您在编译时没有 xml 布局文件,因为它将稍后从网站加载。因此,您可以制作一个包含无聊的黑白文本的默认布局并编译它。然后稍后,我想做的是进入菜单或其他东西,然后单击“使用皮肤#1”或“使用皮肤#2”。然后整个布局应该改变,我所有无聊的黑白文本或基本布局元素都应该改变,好像我从一开始就使用了那个xml文件
  • (即好像我已经将该 xml 文件作为我的布局文件然后编译它。实际上我是在之后加载它
【解决方案3】:

似乎无法根据文档动态加载布局和更改皮肤:

因此,目前无法在运行时在纯 XML 文件上使用带有 XmlPullParser 的 LayoutInflater;它仅适用于从已编译资源(R.something 文件)返回的 XmlPullParser。

http://developer.android.com/reference/android/view/LayoutInflater.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多