2013-09-05 1 views
5

xmlレイアウトをサーバーから動的にロードする必要があります。 LayoutInflaterは、XmlPullParserを使用するメソッドを拡張しています。私はそれを試みましたが、うまくいきません。XmlResourceParserの実装

Androidのソースコードを見ると、XmlResourceParserでこれらのinflateメソッドが呼び出されていることがわかります。 Androidが使用する実装はXmlBlock.Parserですが、これはパブリックAPIではありません。

使用できるXmlResourceParserパブリック実装はありますか? Android documentationで説明したように

+0

あなたがやろうとしているのは、サーバーからリソースファイルをダウンロードし、アプリケーションのリソースであるかのように読むことです。 –

+0

LayoutInflaterのメソッドを使用しようとしているときに取得しているエラーは何ですか? –

+0

正しいですが、サーバーからリソースファイルをダウンロードしてアプリで使用しようとしています。 – Mugur

答えて

4

あなたは伝統的なXmlPullParserを使用することができます。

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. 

私は推測何、Androidの自分だけ前処理リソースに依存している場合は多分あなたはLayoutInflater.Factory2の独自の実装をしなければならないということです。

+0

与えた例では、myResourceはintです。リソースがアプリの一部ではないので、私はそのintを持っていません。 – Mugur

+0

inflateメソッドはXmlResourceParserを使用します。その唯一の実装は、いくつかのネイティブコードを使用し、パブリックAPIの一部ではないXmlBlock.Parserです。したがって、私の問題。 – Mugur

+0

ああ申し訳ありませんが、私はintreをcarrefully見ていませんでした。いくつかの回避策を検索します。あなたが話したXmlResourceParserについて調べたが、それを見つけられなかった。ドキュメントにはXmlPullParserがあり、ソースコードはそれをキャストしようとしません(私は4.0.3を見ましたが、何かが見逃されているかもしれません)。 XmlResourceParserのより正確なリファレンスを提供できますか? –

1

実際、xmlレイアウトを動的に読み込むことはできません。アンドロイドシステムではXmlResourceParserは必要ありません。アンドロイドのシステムがリソースを膨らませると、それはパーサをバイナリxmlソースパーサ(私はクラス名を忘れてしまった)のプライベートな実装に変換するだけです。

1年前、私はこれを試して、何度も何度も過ごしました。だから、もう一度あなたの時間を無駄にしないでください。

+0

Androidのソースコードを見ると、XmlResourceParserをパラメータとしてLayoutInflater.inflateメソッドが呼び出されます。理論的には、XmlResourceParserの実装は私の問題を解決しますが、私はどこでもAndroidバイナリXMLフォーマットの仕様を見つけることができませんでした。だから私はそれができないとあなたに同意しない、それはちょうどこの時点では非常に複雑なので、私はそれを今しようとする時間の無駄であることを2点目に同意する。 – Mugur

+0

私は知っていますが、Viewのコンストラクタを見るだけで、 'Context.obtainStyledAttributes'で' AttributeSet'を処理し、次に 'Resources.obtainStyledAttributes'を処理します。このメソッドで: 'XmlBlock.Parser parser =(XmlBlock.Parser)set'。 XmlPullParserを実装する場合、このオブジェクトを表示するにはどうすればよいですか? AttributeSetを無視して、それらをすべて自分で実装することもできます。しかし、Viewのコンストラクタはアクセスできない多くの '@ hide' APIを使用することに注意してください。 – afpro

1

パフォーマンスの理由から、ビューのインフレーションは、ビルド時に行われるXMLファイルの前処理に大きく依存します。したがって、実行時にプレーンXMLファイルでXmlPullParserを使用してLayoutInflaterを使用することは現時点では不可能です。

これは実行できないとは限りません。しかし、xmlファイルでビルドツールを実行して適切な形式にする必要があります。次に、 'LayoutInflator'で使用するとダウンロードされたデータを返す 'Context'と 'Resources'をモックすることができます

+0

「コンテキスト」と「リソース」をモックする方法に関するアイデアはありますか? – Mugur