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

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

如果您试图给构建过程中未包含的XML文件进行膨胀,我认为目前不可能。 这是来自LayoutInflater类的java-docs:

查看android.view.LayoutInflater.inflate(XmlPullParser解析器,ViewGroup根,布尔attachToRoot)

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

重要由于性能原因,视图通胀在很大程度上依赖于在构建时完成的XML文件的预处理。 因此, 目前无法在运行时将LayoutInflater与XmlPullParser一起使用普通XML文件。

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

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

在基本表XML中:

          

和代码:

 @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,添加信息和风格的行。

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

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

是。

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

正如@Chirag Raval所说。

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

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


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

例:

 Receive text, image, text + image 

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

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(, ); container.addView(view.getAsView()); 

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

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

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

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