Подтвердить что ты не робот

Динамическая загрузка xml-макета в android

Можно ли загружать файл макета xml-активности из ресурса, хранящегося в устройстве (в db или части ресурсов), и загружать его динамически при запуске этой активности? Идея состоит в том, чтобы отправить его на устройство с веб-службы. Спасибо.

4b9b3361

Ответ 1

Если вы пытаетесь раздуть XML файл, который не был включен во время процесса сборки, я не думаю, что в настоящее время это возможно. Это из java-документов LayoutInflater class:

Просмотр android.view.LayoutInflater.inflate(парсер XmlPullParser, ViewGroup root, boolean attachToRoot)

Наполните новую иерархию представлений из указанного XML node. Броски InflateException, если есть ошибка.

Важно. Из соображений производительности просмотр инфляции в значительной степени зависит от предварительная обработка XML файлов, которые выполняются во время сборки. Следовательно, это в настоящее время невозможно использовать LayoutInflater с XmlPullParser над простым XML файлом во время выполнения.

Ответ 2

Начиная с даты публикации, Android содержит только встроенный способ раздувания XML-макета, хранящегося в качестве ресурса макета в файле APK. Если вы хотите раздуть аналогичный (или другой) XML из других источников, вам придется реализовать это самостоятельно, возможно, клонируя некоторую логику из класса LayoutInflater. Будьте предупреждены, что Android много работает, чтобы оптимизировать чтение и анализ файлов ресурсов во время выполнения, поэтому, если вы планируете самостоятельно загружать эту динамику, будьте готовы к тому, чтобы она раздувала LOT медленнее.

Ответ 3

Если вам нужно загружать информацию из db, возможно, это поможет вам сделать базовый 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 существует только основная панель с именем, названием, значением и единицей. И динамически добавляйте строки с информацией и стилем.

Может быть, это помогает, это работает для меня.

Ответ 4

Возможно ли загрузить файл вида xml файла активности из ресурса, хранящегося в устройстве

Да.

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

Как сказал @Chirag Raval.

Возможно ли загрузить файл activity xml файла activity xml из службы db/web?

Не думайте так. Поскольку reference (id) на макет reference (id) которую вы вызываете из R.layout.XPTO, предварительно скомпилирована. Вы не можете добавлять значения во время выполнения.


Среднесрочный вариант, который вы можете использовать (и который я использую в некоторых приложениях), задает заранее определенное число "блоки", которое можно переустановить в соответствии с отправляемыми данными.

Пример:

Receive text, image, text + image

Загрузить: text_block.xml затем image_block.xml а затем text_and_image_block.xml

Ответ 5

Ребята из flipkart создали альтернативу для Android LayoutInflater, которая принимает 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
    }
  }
}

И для динамического раздувания: используйте 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

Ответ 6

Невозможно "из коробки", как объяснено в других ответах, но проект с открытым исходным кодом ItsNat Droid прилагает большие усилия для обеспечивают рендеринг собственных XML-ресурсов Android, загруженных удаленно (HTTP), похожих на "родной Android" браузер, собственный XML на базе Android вместо HTML и Beanshell вместо JavaScript.

Очевидно, что производительность не будет такой же, как локальные предварительно скомпилированные исходные ресурсы. Это похоже на сравнение веб-приложения с настольным приложением, веб-приложение отлично подходит для большинства потребностей, но не подходит для игр, в Android local/remote очень похоже.