我有一个向用户显示的活动。在活动上我有一个按钮。每当用户按下按钮时,应用程序将从远程服务器加载xml文件。 xml文件实际上是为应用程序设计的布局。在新的xml文件加载并存储在newLayout变量之后,我想设置xml文件来替换向用户显示的当前布局。
String newLayoutStr = "";
onClickButton() {
newLayoutStr = loadNewLayoutFromRemoteServer();
}
// set the layout contained in newLayoutStr as new layout of the current activity
有任何意见吗?
答案 0 :(得分:2)
根据你的要求,这是不可能的。 Android使用自动生成的类调用R依赖于资源标识符。该文件包含应用程序中各种类值的public static final int
引用。这里引用的类可以在http://developer.android.com/reference/android/R.html
此类用于引用应用程序中的各种资源,其中一个是layout
。因此,系统期望xml中定义的所有布局都包含在此生成的R
类中。
所以在一句话中:你将无法以你想要的方式实现这一目标。
我要做的是有一个json响应并将其转换为动态生成的布局。
为XML下载test.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent">
<TextView android:id="@+id/textViewTest"
android:layout_centerInParent="true"
android:gravity="center"
android:layout_height="wrap_content"
android:layout_width="match_parent"/>
</RelativeLayout>
如果您想在应用中创建此布局,请创建一个json响应:
{
"layout_parent":"RelativeLayout",
"layout_height": "match_parent",
"layout_width": "match_parent",
"layout_children": [
{
"layout_child":"TextView",
"layout_child_id":"textViewTest",
"layout_height":"wrap_content",
"layout_width":"match_parent",
"layout_gravity":"center",
"layout_centerInParent":"true"
}
]
}
然后,我会将其解析为模型对象,并使用该模型对象动态构建布局。为了添加字段,您需要在xml中定义一些布局,以便能够在应用中添加更多字段。
答案 1 :(得分:0)
据我所知,目前无法在运行时动态加载Layout,这在编译时是不可用的。这是因为LayoutInflater需要一个资源ID(来自R类),这是在编译时确定的。另一种方法是实现一个自定义的LayoutInflater(通过借用LayoutInflater类中的一些想法)来实现这一点,尽管由于在编译时进行了大量优化,这将非常缓慢
答案 2 :(得分:-1)
我不确定这可以在运行时从内存中完成。您可以编组XML并将其保存到SD卡,然后使用AssetManager
将其作为资源加载从那里你可以使用getLayoutInflater().inflate(YourResourceID, TheRootView)