2013-09-05 7 views
5

Ich muss ein XML-Layout dynamisch vom Server laden. LayoutInflater hat Methoden zum Aufblasen, die einen XmlPullParser verwenden. Ich habe das versucht, aber es funktioniert nicht.XmlResourceParser Implementierung

Wenn Sie in den Android-Quellcode schauen, stellt sich heraus, dass diese Inflate-Methoden mit einem XmlResourceParser aufgerufen werden. Die von Android verwendete Implementierung ist XmlBlock.Parser, aber das ist keine öffentliche API.

Gibt es eine öffentliche XmlResourceParser-Implementierung, die ich verwenden kann?

+0

Sie versuchen, eine Ressourcendatei von einem Server herunterzuladen und dann zu lesen, als ob es eine Ressource Ihrer Anwendung wäre, oder? –

+0

Welcher Fehler tritt auf, wenn Sie versuchen, die LayoutInflater-Methode zu verwenden? –

+0

Richtig, ich versuche, eine Ressourcendatei vom Server herunterzuladen und in der App zu verwenden. – Mugur

Antwort

4

können Sie ein traditionelles XmlPullParser verwenden wie in Android documentation beschrieben:

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

Bitte sehen, was für weitere Details in XmlPullParser documentation erklärt wird.


Edit: Von LayoutInflater#inflate() Dokumentation:

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. 

Was ich denke, ist, dass vielleicht sollten Sie Ihre eigene Implementierung von LayoutInflater.Factory2 wenn Android eigene nur auf vorverarbeitet Ressourcen angewiesen machen.

+0

In dem Beispiel, das Sie angegeben haben, ist myResource ein int. Ich habe das int nicht, da die Ressource nicht Teil der App war. – Mugur

+0

Die Inflate-Methode verwendet einen XmlResourceParser. Und die einzige Implementierung davon ist XmlBlock.Parser, die nativen Code verwendet und nicht Teil der öffentlichen API ist. Daher mein Problem. – Mugur

+0

Oh Entschuldigung, ich habe den Int. Nicht geschaut. Ich suche nach einer Problemumgehung. Ich habe nach dem XmlResourceParser gesucht, den Sie gesprochen haben, und habe ihn nicht gefunden.Die Dokumentation spricht von einem XmlPullParser und der Quellcode macht keinen Versuch, ihn zu casten (ich habe 4.0.3 gesehen, aber vielleicht habe ich etwas verpasst). Könnten Sie eine genauere Referenz für den XmlResourceParser geben? –

1

tatsächlich können Sie XML-Layout nicht dynamisch laden. Android-System benötigt keinen XmlResourceParser. wenn android ui system eine ressource inflationiert, konvertiert es einfach den parser in seine private implementierung, einen binary xml source parser (ich habe den klassennamen vergessen).

Vor 1 Jahr versuchte ich dies, verbrachte viele Male. Also verschwende deine Zeit nicht wie ich wieder.

+0

Wenn Sie sich den Android-Quellcode ansehen, werden Sie feststellen, dass die LayoutInflater.inflate-Methode mit einem XmlResourceParser als Parameter aufgerufen wird. Theoretisch wird eine Implementierung des XmlResourceParser mein Problem lösen, aber ich konnte nirgends die Spezifikationen für das binäre xml-Format von Android finden. Also, ich stimme dir nicht zu, dass es nicht möglich ist, es ist zu diesem Zeitpunkt einfach sehr kompliziert, also stimme ich deinem zweiten Punkt zu, dass es Zeitverschwendung ist, es jetzt zu versuchen. – Mugur

+0

ich weiß, aber es nur Blick auf Konstruktor, es verarbeiten 'AttributeSet' von' Context.obtainStyledAttributes' und dann 'Resources.obtainStyledAttributes'. in dieser Methode: 'XmlBlock.Parser parser = (XmlBlock.Parser) set'. Wenn Sie XmlPullParser implementieren, wie können Sie dieses Objekt zum Anzeigen bereitstellen? oder Sie können AttributeSet ignorieren und sie alle selbst implementieren. Beachten Sie jedoch, dass Views Konstruktor viele '@ hide'-APIs verwendet, auf die Sie nicht zugreifen können. – afpro

1

Aus Performancegründen hängt die Anzeige der Inflation stark von der Vorverarbeitung der XML-Dateien ab, die zum Zeitpunkt der Erstellung erfolgt. Daher ist es zur Zeit nicht möglich, LayoutInflater mit einem XmlPullParser über eine reine XML-Datei zur Laufzeit zu verwenden.

Das heißt nicht, dass es nicht getan werden kann. Aber Sie müssen die Build-Tools in der XML-Datei ausführen, um sie in das richtige Format zu bringen. Dann können Sie wahrscheinlich einen 'Kontext' und 'Ressourcen' vortäuschen, der die heruntergeladenen Daten zurückgibt, wenn sie in einem 'LayoutInflator' verwendet werden.

+0

Irgendwelche Ideen, wie man "Kontext" und "Ressourcen" verspottet? – Mugur