Можно ли загружать файл макета xml-активности из ресурса, хранящегося в устройстве (в db или части ресурсов), и загружать его динамически при запуске этой активности? Идея состоит в том, чтобы отправить его на устройство с веб-службы. Спасибо.
Динамическая загрузка xml-макета в android
Ответ 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 очень похоже.