2013-09-05 10 views
5

Ho bisogno di caricare dinamicamente un layout xml dal server. LayoutInflater ha inflazione metodi che utilizzano un XmlPullParser. L'ho provato, ma non funziona.Implementazione XmlResourceParser

Esaminando il codice sorgente di Android, risulta che i metodi di gonfiaggio vengono chiamati con XmlResourceParser. L'implementazione utilizzata da Android è XmlBlock.Parser, ma questa non è un'API pubblica.

Esiste un'implementazione pubblica XmlResourceParser che è possibile utilizzare?

+0

Quello che stai cercando di fare è scaricare un file di risorse da un server e leggerlo come se fosse una risorsa della tua applicazione, giusto? –

+0

Qual è l'errore che stai ottenendo quando provi ad usare il metodo di LayoutInflater? –

+0

Corretto, sto cercando di scaricare alcuni file di risorse dal server e usarli nell'app. – Mugur

risposta

4

È possibile utilizzare un tradizionale XmlPullParser come descritto nel Android documentation:

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

Si prega di vedere ciò che è spiegato nel XmlPullParser documentation per maggiori dettagli.


Edit: Da LayoutInflater#inflate() documentazione:

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. 

Quello che credo, è che forse si dovrebbe fare la propria implementazione di LayoutInflater.Factory2 se Android propria solo contare su risorse preprocessati.

+0

Nell'esempio che hai dato, myResource è un int. Non ho questo int come la risorsa non faceva parte dell'app. – Mugur

+0

Il metodo di gonfiaggio utilizza un XmlResourceParser. E l'unica implementazione è XmlBlock.Parser che utilizza un codice nativo e non fa parte dell'API pubblica. Quindi, il mio problema. – Mugur

+0

Oh scusa, non ho guardato con attenzione l'int. Cercherò qualche soluzione. Ho controllato su XmlResourceParser che hai parlato e non l'ho trovato.La documentazione parla di un XmlPullParser e il codice sorgente non fa alcun tentativo di lanciarlo (ho un aspetto 4.0.3, ma potrei aver perso qualcosa). Potresti dare qualche riferimento più preciso per XmlResourceParser? –

1

infatti, NON è possibile caricare il layout xml in modo dinamico. sistema Android NON ha bisogno di un XmlResourceParser. quando il sistema ui di Android gonfia una risorsa, converte semplicemente il parser nella sua implementazione privata, un parser di sorgenti XML xml (ho dimenticato il nome della classe).

1 anno fa, ho provato questo, trascorso molte molte volte. quindi, non sprecare il tuo tempo come me di nuovo.

+0

Se date un'occhiata al codice sorgente di Android, noterete che il metodo LayoutInflater.inflate viene chiamato con un XmlResourceParser come parametro. In teoria, un'implementazione di XmlResourceParser risolverà il mio problema, ma non sono riuscito a trovare da nessuna parte le specifiche per il formato xml binario di Android. Quindi, non sono d'accordo con te sul fatto che non possa essere fatto, è solo molto complicato in questo momento, quindi sono d'accordo con il secondo punto che è una perdita di tempo provare a farlo ora. – Mugur

+0

lo so, ma guarda il costruttore di View, processa 'AttributeSet' da' Context.obtainStyledAttributes', e poi 'Resources.obtainStyledAttributes'. in questo metodo: 'XmlBlock.Parser parser = (XmlBlock.Parser) set'. se si implementa XmlPullParser, come è possibile fornire questo oggetto per la visualizzazione? oppure potresti ignorare AttributeSet e implementarli tutti da soli. ma si noti che, il costruttore di View utilizza molte API '@ hide' a cui non si può accedere. – afpro

1

Per motivi di prestazioni, l'inflazione si basa molto sulla preelaborazione dei file XML eseguita in fase di produzione. Pertanto, non è attualmente possibile utilizzare LayoutInflater con un XmlPullParser su un file XML normale in fase di runtime.

Questo non vuol dire che non si possa fare. Ma dovrai eseguire gli strumenti di compilazione sul file xml per ottenere il formato giusto. Quindi è possibile simulare un "contesto" e "risorse" che restituisce i dati scaricati quando utilizzati in un "LayoutInflator"

+0

Qualche idea su come "deridere un 'Contesto' e 'Risorse'"? – Mugur