Я пытаюсь загрузить файл XML, созданный пользователем, чтобы использовать его в своем приложении. Я знаю, что невозможно использовать XML-файл в качестве ресурса, потому что файлы макета компилируются при создании процесса APK. Есть ли способ использовать/создавать/загружать макеты на лету вне папки макета?Загрузить макет, созданный пользователем
ответ
Вы не можете раздуть произвольный XML, поскольку XML-файлы в проектах Android обрабатываются во время сборки и преобразуются в двоичный формат. Другими словами, вы можете только создавать макеты программно с помощью API Java.
Что вы можете сделать, это разобрать файл пользователя со стандартным XML парсер (например, XmlPullParser
и строить взгляды самостоятельно. В основном вы будете повторно реализующие LayoutInflater
, которые вы можете найти исходный код в Интернете.
Следует отметить, что XML-пользователь не сможет ссылаться на ресурсы вообще. Например, они не могли бы сделать что-то вроде android:textColor="@color/some_color"
. Обработка сборки превращает такие ссылки в указатели на значения ресурсов, тогда как если бы вы просто прочитайте это в простом XML, это будет только текст "@color/some_color"
.
Возможно, вместо того, чтобы разрешать чтобы создать полноценные XML-макеты Android, вы должны выбрать ограниченное подмножество вещей, которые вы будете поддерживать, и определить более простой способ описания этих настраиваемых макетов. Тогда вам не придется использовать XML, вы можете определить пользовательский «язык» только с теми вещами, которые вы хотите. Таким образом, вы можете ограничить пользователей относительно простыми API-интерфейсами, такими как цвет текста; вы просто сопоставляете какое-либо поле, определенное на вашем пользовательском языке, с вызовом textView.setTextColor()
.
Вы можете создать XmlPullParser из своего файла и передать его на разводку макета.
Для создания XMLPullParser из файла вы можете следовать этому примеру: https://developer.android.com/reference/org/xmlpull/v1/XmlPullParser.html
И после того, как объект XMLPullParser, вы можете вызвать этот метод: https://developer.android.com/reference/android/view/LayoutInflater.html#inflate(org.xmlpull.v1.XmlPullParser, android.view.ViewGroup)
Вам нужен ViewGroup, который будет родителем представления. Если вам нужно, чтобы представление было активным, я рекомендую вам создать пустую операцию с макетом и добавить обработанный макет в пустой макет. Не пытайтесь раздуть макет без родителя, вы можете иметь разные результаты на разных устройствах.
На самом деле это макет уведомлений, поэтому ни один родитель:/ – greywolf82
@ greywolf82 Я видел, что теперь NotificationBuilder ожидает RemoteView. Я думаю, что вы можете создать RemoteViews из пустого файла макета (только с группой просмотра) и после использования метода addView (View) добавить добавленное представление из LayoutInflater. И вы можете использовать RemoteViews как родительский. – jonathanrz
В документе есть: Важно По соображениям производительности просмотр инфляции в значительной степени зависит от предварительной обработки XML-файлов, которая выполняется во время сборки. Поэтому в настоящее время невозможно использовать LayoutInflater с XmlPullParser поверх обычного XML-файла во время выполнения. – greywolf82
- 1. Динамически созданный макет изображения
- 2. Созданный пользователем SQL-запрос
- 3. Как удалить динамически созданный макет
- 4. Drop Postgresql пользователь, созданный пользователем
- 5. Индекс, созданный под другим пользователем
- 6. Фильтр резервирования, созданный зарегистрированным пользователем
- 7. Moodle загрузить созданный PDF
- 8. Загрузить динамически созданный Flash
- 9. Созданный пользователем хостинг изображений для angularJS App
- 10. Почему тип Oracle, созданный одним пользователем, не отображается другим пользователем?
- 11. Загрузить библиотеку, написанную пользователем
- 12. Макет модуля, созданный в Zend Framework
- 13. Android: Найти осколок в динамически созданный макет
- 14. Используя AutoFixture созданный макет в конкретной реализации
- 15. Искаженный макет, созданный из XML в Android
- 16. WPF-макет, созданный динамически с использованием MVVM
- 17. Сохраните динамически созданный макет при повороте экрана
- 18. Не удается найти файл, созданный пользователем OUTFILE
- 19. .net Workflows - созданный пользователем или бизнес-аналитиком
- 20. getText from all TextView, созданный пользователем
- 21. Django - только отображение объектов Созданный пользователем
- 22. SPWeb.User не возвращается вновь созданный пользователем
- 23. AWS limit number of EC2s, созданный пользователем
- 24. Как добавить запятую в массив, созданный пользователем?
- 25. Созданный пользователем (MS-Office) контент - как?
- 26. Git subodule, созданный пользователем другой группы
- 27. созданный пользователем XML, кодировка кросс-совместимости
- 28. Добавление wp_editor в созданный пользователем metoxox
- 29. Как получить объект Parse, созданный пользователем
- 30. Как сохранить контент, созданный пользователем на KitKat +?
Как я знаю, это невозможно сделать в общем случае – Vyacheslav