2013-09-05 1 views
5

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

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

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

+0

Что вы пытаетесь сделать, это загрузить некоторый файл ресурсов с сервера, а затем прочитать его, как если бы он был ресурсом вашего приложения, не так ли? –

+0

Какова ошибка, которую вы получаете при попытке использовать метод LayoutInflater? –

+0

Правильно, я пытаюсь загрузить некоторый файл ресурсов с сервера и использовать его в приложении. – Mugur

ответ

4

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

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

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


Edit: Из 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 собственного полагаться только на предварительно обработанных ресурсов.

+0

В примере, который вы указали, myResource - это int. У меня нет этого int, поскольку ресурс не был частью приложения. – Mugur

+0

Метод inflate использует XmlResourceParser. И единственной реализацией этого является XmlBlock.Parser, который использует некоторый собственный код и не является частью публичного API. Следовательно, моя проблема. – Mugur

+0

О, извините, я не наблюдал за собой int. Я попробую обходное решение. Я проверил об XmlResourceParser, с которым вы говорили, и не нашел его.Документация говорит об XmlPullParser, и исходный код не делает попыток сделать это (я смотрю 4.0.3, но, возможно, что-то пропустил). Не могли бы вы дать более точную ссылку для XmlResourceParser? –

1

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

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

+0

Если вы посмотрите на исходный код Android, вы заметите, что метод LayoutInflater.inflate вызывается с параметром XmlResourceParser. Теоретически реализация XmlResourceParser решит мою проблему, но я не смог найти спецификации для бинарного XML-формата Android. Поэтому я не согласен с вами в том, что это невозможно сделать, это очень сложно в данный момент, поэтому я согласен с вашим вторым моментом в том, что это пустая трата времени, чтобы попытаться сделать это сейчас. – Mugur

+0

Я знаю, но просто смотрю на конструктор View, он обрабатывает 'AttributeSet'' Context.obtainStyledAttributes', а затем 'Resources.obtainStyledAttributes'. в этом методе: 'XmlBlock.Parser parser = (XmlBlock.Parser) set'. если вы реализуете XmlPullParser, как вы можете предоставить этот объект для просмотра? или вы можете игнорировать AttributeSet и реализовать их самостоятельно. но обратите внимание, что конструктор View использует много '@ hide' api, к которым вы не можете получить доступ. – afpro

1

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

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

+0

Любые идеи о том, как «издеваться над« Контекстом »и« Ресурсами »? – Mugur

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