通过运行时主内存中包含的XML字符串更改活动的布局

时间:2015-03-16 12:53:25

标签: android android-layout

我有一个向用户显示的活动。在活动上我有一个按钮。每当用户按下按钮时,应用程序将从远程服务器加载xml文件。 xml文件实际上是为应用程序设计的布局。在新的xml文件加载并存储在newLayout变量之后,我想设置xml文件来替换向用户显示的当前布局。

String newLayoutStr = "";
onClickButton() {
    newLayoutStr = loadNewLayoutFromRemoteServer();
}

// set the layout contained in newLayoutStr as new layout of the current activity

有任何意见吗?

3 个答案:

答案 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)

来扩充XML