活动在android中动态加载xml布局

时间:2011-03-16 12:07:24

标签: java android android-activity

是否可以从存储在设备中的资源(在db或部分资源中)加载活动的xml布局文件,并在该活动启动时动态加载它?我们的想法是从Web服务将其发送到设备。感谢。

6 个答案:

答案 0 :(得分:23)

如果您尝试对构建过程中未包含的XML文件进行充气,我认为目前不可能。这来自LayoutInflater class

的java-docs
  

查看android.view.LayoutInflater.inflate(XmlPullParser解析器,   ViewGroup root,boolean attachToRoot)

     

从指定的XML节点扩充新的视图层次结构。抛出   InflateException如果有错误。

     

重要由于业绩原因,观点通胀严重依赖   在构建时完成的XML文件的预处理。因此,它   目前无法将LayoutInflater与XmlPullParser一起使用   在运行时通过纯XML文件。

答案 1 :(得分:6)

截至发布之日,Android仅包含一种内置方式,用于对存储为APK文件中的布局资源的布局XML进行充气。如果您想从其他来源扩充类似(或不同)的XML,您必须自己实现,可能是通过从LayoutInflater类克隆一些逻辑。请注意,Android在运行时优化资源文件的读取和解析方面做了很多工作,因此如果您打算自己动态加载它,请准备好让它更慢地膨胀。

答案 2 :(得分:3)

如果你必须从数据库加载信息,也许它可以帮助你做一个基本的XML,并在其上插入信息,如表格或类似的东西。你可以尝试这样的事情:

在基本表格XML中:

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:stretchColumns="1"
android:id="@+id/SensorInfoTableLayout">

<TableRow>
    <TextView
            android:text="@string/sensor_name_title"
            android:padding="3dip" /> 
    <TextView
            android:text="@string/sensor_type_title"
            android:padding="3dip" />
    <TextView
            android:text="@string/sensor_value_title"
            android:padding="3dip" />
    <TextView
            android:text="@string/sensor_unit_title"
            android:padding="3dip" />
</TableRow>

<View
    android:layout_height="4dip"
    android:background="#FF909090" /></TableLayout>

代码:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); 

    getSensorInfo();
    setContentView(R.layout.sensorinfo);

    setInfoByView();
}

private void setInfoByView() {
    TableLayout myTableLayout = null;
    myTableLayout = (TableLayout)findViewById(R.id.SensorInfoTableLayout);

    // Add row to table
    myTableLayout.addView(createRow("maxRange",maxRangeType, "" + maxRange ,maxRangeUnits));
    myTableLayout.addView(createRow("minDelay",minDelayType,"" + minDelay, minDelayUnits));
    myTableLayout.addView(createRow("name",nameType,"" + name, nameUnits));
    myTableLayout.addView(createRow("powerReq",powerReqType,"" + powerReq, powerReqUnits));
    myTableLayout.addView(createRow("resolution",resolutionType,"" + resolution, resolutionUnits));
    myTableLayout.addView(createRow("type",typeType,"" + type, typeUnits));
    myTableLayout.addView(createRow("vendor",vendorType,"" + vendor, vendorUnits));
    myTableLayout.addView(createRow("version",versionType,"" + version, versionUnits));
}

private TableRow createRow(String name, String type, String value, String unit) {
    // Create new row
    TableRow myTableRow = new TableRow(this);
    myTableRow.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
    //myTableRow.setGravity(Gravity.CENTER_HORIZONTAL);
    myTableRow.setPadding(5, 5, 5, 5);
    // Add name
    myTableRow.addView(createTextView(name));
    // Add type
    myTableRow.addView(createTextView(type));
    // Add value
    myTableRow.addView(createTextView(value));
    // Add units
    myTableRow.addView(createTextView(unit));

    return myTableRow;
}

在XML中,它只存在主要栏,包括名称,标题,值和单位。然后,添加信息和样式的行。

也许有帮助,它对我有用。

答案 3 :(得分:2)

  

是否可以从存储在设备中的资源加载活动的xml布局文件

是的。

View inflatedView = View.inflate(this, R.layout.sample, null);
container.addView(inflatedView);

正如@Chirag Raval所说。

  

是否可以从db / web服务加载activity's xml布局文件?

不要这么认为。因为您从reference (id)调用的布局R.layout.XPTO已预编译。您无法在运行时添加值。


您可以使用的中期选项(我在某些应用中使用)设置了预定数量的“块”,可以根据数据重新排列发送。

示例:

Receive text, image, text + image

加载:text_block.xml然后image_block.xml,然后加载text_and_image_block.xml

答案 4 :(得分:2)

flipkart的人已经为Android的LayoutInflater创建了一个替代方案,它接受JSON,可以在任何地方托管。它还接受可选数据,用于绑定到本地膨胀视图的数据。

View的JSON示例

{    
  "type": "LinearLayout",
  "orientation": "vertical",
  "padding": "16dp",
  "children": [{
    "layout_width": "200dp",
   "gravity": "center",
    "type": "TextView",
    "text": "@{user.profile.name}"
  }, {
    "type": "HorizontalProgressBar",
    "layout_width": "200dp",
    "layout_marginTop": "8dp",
    "max": 6000,
    "progress": "@{user.profile.experience}"
  }]
}

示例数据JSON:

{
  "user": {
    "profile": {
      "name": "John Doe",
      "experience": 4192
    }
  }
}

动态膨胀:通过将ProteusView包含在项目中来使用它:

ProteusView view = proteusLayoutInflater.inflate(<layout>, <data>);
container.addView(view.getAsView());

以下是作者自己的介绍: https://www.slideshare.net/mobile/KiranKumar1320/proteus-android-layout-engine

在这里查看: https://github.com/flipkart-incubator/proteus/blob/master/README.md

答案 5 :(得分:0)

不可能&#34;开箱即用&#34;正如其他答案中所解释的那样,但开源项目ItsNat Droid付出了巨大努力,提供了远程下载的基于Android原生XML的资源(HTTP)的渲染,类似于原生Android&#34;浏览器,基于Android的本机XML而不是HTML和Beanshell脚本而不是JavaScript。

显然,性能不会与本地预编译的本机资源相同。这类似于将Web应用程序与桌面应用程序进行比较,Web应用程序可以满足大多数需求但不适合游戏,在Android本地/远程非常相似。