簡體   English   中英

活動在android中動態加載xml布局

[英]Activities loading xml layout dynamically in android

是否可以從存儲在設備中的資源(在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在運行時優化資源文件的讀取和解析方面做了很多工作,因此如果您打算自己動態加載它,請准備好讓它更慢地膨脹LOT。

如果你必須從數據庫加載信息,也許它可以幫助你做一個基本的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中,它只存在主條,包括名稱,標題,值和單位。 然后,添加信息和樣式的行。

也許它有幫助,它對我有用。

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

是否可以從存儲在設備中的資源加載活動的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

如其他答案中所解釋的那樣,“開箱即用”是不可能的,但是開源項目ItsNat Droid在提供遠程下載的基於Android原生XML的資源(HTTP)方面付出了巨大努力,類似於“原生Android”瀏覽器,基於Android的原生XML而不是HTML和Beanshell腳本而不是JavaScript。

顯然,性能不會與本地預編譯的本機資源相同。 這類似於將Web應用程序與桌面應用程序進行比較,Web應用程序可以滿足大多數需求但不適合游戲,在Android本地/遠程非常相似。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM