在Android中dynamic加载xml布局

是否有可能从存储在设备中的资源(在数据库或部分资源中)加载活动的xml布局文件,并在该活动启动时dynamic加载它? 这个想法是从一个Web服务发送到设备。 谢谢。

Solutions Collecting From Web of "在Android中dynamic加载xml布局"

如果你正在尝试膨胀一个在构build过程中没有包含的XML文件,我不认为这是现在可能的。 这是来自LayoutInflater类的java-docs:

查看android.view.LayoutInflater.inflate(XmlPullParserparsing器,ViewGroup根,boolean attachToRoot)

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

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

截至本文发布之日,Android仅包含一种内置的方式来将充当布局资源的布局XML存储为APK文件中的布局资源。 如果你想膨胀来自其他来源的类似(或不同)的XML,你将不得不自己实现,也许是从LayoutInflater类中克隆一些逻辑。 要警告的是,Android在运行时会优化资源文件的读取和parsing,所以如果你打算自己dynamic地加载这个文件,就要做好准备,让它慢一点。

如果你必须从一个数据库加载信息,也许它可以帮助你做一个基本的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中,它只存在主体栏,名称,标题,值和单位。 Dinamically,添加信息和样式的行。

也许它有帮助,它适用于我。

Is it possible to load an activity's xml layout file from a resource stored in the device

是。

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

正如@Chirag Raval所说。

 Is it possible to load an `activity's xml` layout file from a `db / web service`. 

不要这样想。 因为您从R.layout.XPTO调用的布局reference (id)是预编译的。 运行时不能添加值。


您可以使用的一个中期选项 (以及我在某些应用程序中使用的选项 )被设置为一个预定数量的“块”,可以根据所发送的数据重新排列。 例:

 Receive text, image, text + image 

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

正如其他答案中所述,“开箱即用”是不可能的,但是开源项目ItsNat Droid非常努力地提供类似于“原生Android”浏览器的基于XML的远程下载(HTTP)的基于XML的资源呈现,原生的基于Android的XML而不是HTML和Beanshell脚本而不是JavaScript。

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

flipkart的家伙已经为Android的LayoutInflater创build了一个替代scheme,该方法接受可以在任何地方托pipe的JSON。并且还接受可选数据,以便将数据绑定到原生的充气视图。

示例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 } } } 

Amddynamic膨胀:使用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