2016-12-04 22 views
2

我想加载用户创建的XML文件,以在我的应用中使用它。我知道无法将XML文件用作资源,因为布局文件是在构建APK进程中编译的。无论如何要在布局文件夹外部使用/创建/加载布局?用户创建的加载布局

+0

据我所知,没有办法做到这一点在一般情况下 – Vyacheslav

回答

3

您不能膨胀任意XML,因为Android项目中的XML文件在构建时得到处理并转换为二进制格式。换句话说,您只能通过Java API以编程方式构建布局。

你可以做的是分析用户的文件与标准的XML解析器(如XmlPullParser和建立你自己。基本上你会被重新实现LayoutInflater,你可以找到网上的源代码的意见。

需要注意的一点是,用户的XML根本无法引用资源,例如他们无法完成像android:textColor="@color/some_color"这样的操作。构建过程会将这些引用转换为资源值的指针,而如果您只是简单地用普通的XML读取它,它只是文本"@color/some_color"

也许不是允许用户可以创建完整的Android布局XML,您应该选择一些您将支持的有限的子集,并定义一种更简单的方式来描述这些自定义布局。那么你不必使用XML,你可以用你想要的东西来定义一个自定义的“语言”。这样您可以将用户限制在相对简单的API中,如文本颜色;您只需将您自定义语言中定义的某个字段映射到textView.setTextColor()即可。

3

您可以从您的文件创建一个XmlPullParser并将其传递给布局压缩程序。

若要从您的文件中XMLPullParser你可以按照这个例子:https://developer.android.com/reference/org/xmlpull/v1/XmlPullParser.html

而且具有XMLPullParser对象之后,就可以调用这个方法:https://developer.android.com/reference/android/view/LayoutInflater.html#inflate(org.xmlpull.v1.XmlPullParser,android.view.ViewGroup)

你需要一个ViewGroup将成为视图的父级。如果您需要该视图为活动,我建议您使用布局创建一个空的活动,并将分析的布局添加到空白布局。不要试图在没有父母的情况下膨胀布局,你可以在不同的设备中获得不同的结果。

+1

这是一个通知布局实际上,所以没有父母:/ – greywolf82

+1

@ greywolf82我看到,现在NotificationBuilder期待RemoteViews。我认为你可以从一个空白的布局文件(只使用视图组)创建一个RemoteViews,并且在使用addView(View)方法从LayoutInflater中添加充气视图之后。您可以使用RemoteView作为父项。 – jonathanrz

+2

在文档中有:重要由于性能原因,查看通货膨胀严重依赖于在构建时完成的XML文件的预处理。因此,在运行时,通过普通的XML文件使用LayoutInflater和XmlPullParser是不可能的。 – greywolf82