Деятельность загружает макет XML динамически в Android - PullRequest
17 голосов
/ 16 марта 2011

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

Ответы [ 6 ]

23 голосов
/ 16 января 2012

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

Просмотреть android.view.LayoutInflater.inflate (XmlPullParser parser, корень ViewGroup, логическое attachToRoot)

Раздуть новую иерархию представления из указанного узла XML.Выдает InflateException, если есть ошибка.

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

6 голосов
/ 17 января 2012

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

3 голосов
/ 17 января 2012

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

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

2 голосов
/ 17 октября 2017

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

2 голосов
/ 12 января 2012

Можно ли загрузить XML-файл макета занятия из ресурса, хранящегося в устройстве

Да.

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

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

Можно ли загрузить файл макета activity's xml из веб-службы БД?

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


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

Пример:

Receive text, image, text + image

Загрузка: text_block.xml, затем image_block.xml итогда text_and_image_block.xml

0 голосов
/ 13 декабря 2015

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

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

...