我想加载用户创建的XML文件,以在我的应用中使用它。我知道无法将XML文件用作资源,因为布局文件是在构建APK进程中编译的。无论如何要在布局文件夹外部使用/创建/加载布局?用户创建的加载布局
回答
您不能膨胀任意XML,因为Android项目中的XML文件在构建时得到处理并转换为二进制格式。换句话说,您只能通过Java API以编程方式构建布局。
你可以做的是分析用户的文件与标准的XML解析器(如XmlPullParser
和建立你自己。基本上你会被重新实现LayoutInflater
,你可以找到网上的源代码的意见。
需要注意的一点是,用户的XML根本无法引用资源,例如他们无法完成像android:textColor="@color/some_color"
这样的操作。构建过程会将这些引用转换为资源值的指针,而如果您只是简单地用普通的XML读取它,它只是文本"@color/some_color"
。
也许不是允许用户可以创建完整的Android布局XML,您应该选择一些您将支持的有限的子集,并定义一种更简单的方式来描述这些自定义布局。那么你不必使用XML,你可以用你想要的东西来定义一个自定义的“语言”。这样您可以将用户限制在相对简单的API中,如文本颜色;您只需将您自定义语言中定义的某个字段映射到textView.setTextColor()
即可。
您可以从您的文件创建一个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将成为视图的父级。如果您需要该视图为活动,我建议您使用布局创建一个空的活动,并将分析的布局添加到空白布局。不要试图在没有父母的情况下膨胀布局,你可以在不同的设备中获得不同的结果。
这是一个通知布局实际上,所以没有父母:/ – greywolf82
@ greywolf82我看到,现在NotificationBuilder期待RemoteViews。我认为你可以从一个空白的布局文件(只使用视图组)创建一个RemoteViews,并且在使用addView(View)方法从LayoutInflater中添加充气视图之后。您可以使用RemoteView作为父项。 – jonathanrz
在文档中有:重要由于性能原因,查看通货膨胀严重依赖于在构建时完成的XML文件的预处理。因此,在运行时,通过普通的XML文件使用LayoutInflater和XmlPullParser是不可能的。 – greywolf82
- 1. 在JS或AJAX中创建新的HTML加载HTML布局?
- 2. SWT布局创建
- 3. 创建树布局
- 4. 在相对布局中创建布局
- 5. android-在加载主布局之前加载进度条布局
- 6. 创建XML的Android布局
- 7. 创建div的布局
- 8. 为AJAX加载创建全局变量
- 9. 如何创建布局使用的UITableViewController
- 10. 如何在Android中保存(用户创建的)动态布局?
- 11. CakePHP iPad布局未加载
- 12. Android:缓慢布局加载
- 13. jQuery递归加载布局
- 14. 加载布局xml失败
- 15. 网站不加载布局
- 16. 创建图像布局
- 17. 创建响应式布局
- 18. Android:创建动态布局
- 19. 从ArrayList创建ListView布局
- 20. 想要创建布局
- 21. 创建布局图像
- 22. 创建三行布局
- 23. 动态创建布局
- 24. 基于用户交互动态加载XAML布局
- 25. WPF用户控件创建多个布局选择
- 26. 使用Ruby on Rails预加载布局
- 27. CSS使用div创建列布局
- 28. 如何用RecyclerView创建此布局?
- 29. 如何使用PreferenceCategory布局创建TextView?
- 30. 用css创建网格布局
据我所知,没有办法做到这一点在一般情况下 – Vyacheslav