2016-12-04 7 views
2

Я пытаюсь загрузить файл XML, созданный пользователем, чтобы использовать его в своем приложении. Я знаю, что невозможно использовать XML-файл в качестве ресурса, потому что файлы макета компилируются при создании процесса APK. Есть ли способ использовать/создавать/загружать макеты на лету вне папки макета?Загрузить макет, созданный пользователем

+0

Как я знаю, это невозможно сделать в общем случае – Vyacheslav

ответ

3

Вы не можете раздуть произвольный XML, поскольку XML-файлы в проектах Android обрабатываются во время сборки и преобразуются в двоичный формат. Другими словами, вы можете только создавать макеты программно с помощью API Java.

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

Следует отметить, что XML-пользователь не сможет ссылаться на ресурсы вообще. Например, они не могли бы сделать что-то вроде android:textColor="@color/some_color". Обработка сборки превращает такие ссылки в указатели на значения ресурсов, тогда как если бы вы просто прочитайте это в простом XML, это будет только текст "@color/some_color".

Возможно, вместо того, чтобы разрешать чтобы создать полноценные XML-макеты Android, вы должны выбрать ограниченное подмножество вещей, которые вы будете поддерживать, и определить более простой способ описания этих настраиваемых макетов. Тогда вам не придется использовать XML, вы можете определить пользовательский «язык» только с теми вещами, которые вы хотите. Таким образом, вы можете ограничить пользователей относительно простыми API-интерфейсами, такими как цвет текста; вы просто сопоставляете какое-либо поле, определенное на вашем пользовательском языке, с вызовом textView.setTextColor().

3

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

+1

На самом деле это макет уведомлений, поэтому ни один родитель:/ – greywolf82

+1

@ greywolf82 Я видел, что теперь NotificationBuilder ожидает RemoteView. Я думаю, что вы можете создать RemoteViews из пустого файла макета (только с группой просмотра) и после использования метода addView (View) добавить добавленное представление из LayoutInflater. И вы можете использовать RemoteViews как родительский. – jonathanrz

+2

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

Смежные вопросы