Можно ли загружать файл макета 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 очень похоже.