Реализация XmlResourceParser

Мне нужно динамически загрузить макет XML с сервера. LayoutInflater имеет методы inflate, которые используют XmlPullParser. Я пробовал это, но это не работает.

Глядя на исходный код Android, выясняется, что эти методы inflate вызываются с помощью XmlResourceParser. В реализации Android используется XmlBlock.Parser, но это не публичный API.

Есть ли публичная реализация XmlResourceParser, которую я могу использовать?

4 ответа

Вы можете использовать традиционный XmlPullParser как описано в документации Android:

InputStream yourRemoteLayout = ...;
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
parser.setInput(yourRemoteLayout, "someEncoding");
AttributeSet attributes = Xml.asAttributeSet(parser);

Пожалуйста, посмотрите, что объясняется в документации XmlPullParser для более подробной информации.


Изменить: Из документации LayoutInflater#inflate():

Important   For performance reasons, view inflation relies heavily on pre-processing of XML files that is done at build time. Therefore, it is not currently possible to use LayoutInflater with an XmlPullParser over a plain XML file at runtime.

Что я думаю, это то, что, возможно, вы должны сделать свою собственную реализацию LayoutInflater.Factory2 если собственные Android полагаются только на предварительно обработанные ресурсы.

На самом деле, вы НЕ МОЖЕТЕ динамически загружать макет XML. Система Android не нуждается в XmlResourceParser. когда система android ui раздувает ресурс, она просто конвертирует синтаксический анализатор в его частную реализацию, двоичный анализатор исходного кода xml (я забыл имя класса).

1 год назад я попробовал это, провел много раз. так что не теряй времени снова как я.

ДА, сейчас это возможно с ItsNat Droid.

Посмотрите на это резюме:

https://groups.google.com/forum/

Он все еще находится в стадии разработки, но наиболее важные функции уже реализованы.

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

Это не значит, что это невозможно. Но вам нужно будет запустить инструменты сборки для XML-файла, чтобы получить его в правильном формате. Тогда вы, вероятно, можете смоделировать "Контекст" и "Ресурсы", которые возвращают загруженные данные при использовании в "LayoutInflator".

Другие вопросы по тегам