2013-09-05 10 views
5

我需要從服務器動態加載xml佈局。 LayoutInflater擴充了使用XmlPullParser的方法。我試過了,但它不起作用。XmlResourceParser實現

展望Android源代碼,事實證明這些膨脹方法稱爲帶有XmlResourceParser。 Android使用的實現是XmlBlock.Parser,但這不是一個公共API。

是否有XmlResourceParser公開的實施可以使用嗎?

+0

什麼你想要做的是從服務器上下載一些資源文件,然後讀取它,如果它是你的應用程序的資源,對不對? –

+0

嘗試使用LayoutInflater方法時,您獲得的錯誤是什麼? –

+0

正確,我試圖從服務器下載一些資源文件並在應用程序中使用它。 – Mugur

回答

4

您可以使用傳統的XmlPullParserAndroid documentation描述:

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

請看看有什麼在XmlPullParser documentation解釋更多的細節。


編輯:從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

膨脹方法使用XmlResourceParser。唯一的實現是XmlBlock.Parser,它使用了一些本地代碼,而不是公共API的一部分。因此,我的問題。 – Mugur

+0

對不起,我沒有仔細觀察整數。我會搜索一些解決方法。我查了一下你說的XmlResourceParser,但沒有找到它。該文檔講述了一個XmlPullParser,並且源代碼不會進行任何嘗試(我看起來4.0.3,但我可能錯過了某些東西)。你可以給一些更精確的參考XmlResourceParser? –

1

實際上,您不能動態加載xml佈局。 android系統不需要一個XmlResourceParser。當android ui系統膨脹資源時,它只是將解析器轉換爲它的私有實現,一個二進制xml源解析器(我忘記了類名)。

1年前,我想這一點,花了很多很多次。所以,不要再把我的時間浪費在我身上了。

+0

如果您查看Android源代碼,您會注意到使用XmlResourceParser作爲參數調用了LayoutInflater.inflate方法。從理論上講,XmlResourceParser的實現將解決我的問題,但是我找不到任何地方的Android二進制XML格式規範。所以,我不同意你說不能做到這一點,在這個時候這很複雜,所以,我同意你的第二點,現在嘗試去做是浪費時間。 – Mugur

+0

我知道,但它只是看着View的構造函數,它通過'Context.obtainStyledAttributes'處理'AttributeSet',然後處理'Resources.obtainStyledAttributes'。在這個方法中:'XmlBlock.Parser parser =(XmlBlock.Parser)set'。如果你實現了XmlPullParser,你如何提供這個對象來查看?或者你可以忽略AttributeSet並自己實現它們。但請注意,View的構造函數使用許多「@ hide」api而無法訪問。 – afpro

1

由於性能方面的原因,查看通貨膨脹嚴重依賴於在構建時完成的XML文件的預處理。因此,在運行時,通過普通的XML文件使用LayoutInflater和XmlPullParser是不可能的。

這並不是說不能做。但是,您需要在xml文件上運行構建工具以將其轉換爲正確的格式。然後你可以或許嘲笑一個「語境」和「資源」在使用時返回下載的數據的「LayoutInflator」

+0

關於如何「嘲諷'背景'和'資源'」的任何想法? – Mugur