2016-12-04 5 views
2

私は自分のアプリケーションで使用するために作成したXMLファイルを読み込もうとしています。レイアウトファイルはAPKプロセスを構築する際にコンパイルされるため、XMLファイルをリソースとして使用することはできません。レイアウトフォルダの外でレイアウトを使用/作成/ロードする方法はありますか?ユーザーが作成したレイアウトを読み込み

+0

私は知っているので、普通の場合これを行う方法はありません – Vyacheslav

答えて

3

AndroidプロジェクトのXMLファイルはビルド時に処理され、バイナリ形式に変換されるため、任意のXMLを展開することはできません。言い換えると、Java APIを使用してプログラムでレイアウトを構築することしかできません。あなたは何ができるか

XmlPullParser例えば(標準XMLパーサーで、ユーザーのファイルを解析し、ビューを自分で構築しています。基本的に、あなたは、オンラインのソースコードを見つけることができLayoutInflaterを、再実装されるだろうです。

例えば、彼らはandroid:textColor="@color/some_color"のような何かをすることができませんでした。ビルド処理は、これらのような参照をリソース値へのポインタに変えますが、単純にこれをプレーンなXMLで読むと、それはちょうどテキスト"@color/some_color"となります。

おそらくユーザーが本格的なAndroidレイアウトのXMLを作成するには、サポートするものの限定されたサブセットを選択し、これらのカスタムレイアウトをより簡単に記述する方法を定義する必要があります。 XMLを使用する必要はなく、必要なものだけでカスタムの「言語」を定義することができます。こうすることで、ユーザーをテキストのような比較的シンプルなAPIに限定することができます。カスタム言語で定義されたフィールドの一部をtextView.setTextColor()の呼び出しにマップするだけです。

3

ファイルからXmlPullParserを作成し、レイアウトインフレータに渡すことができます。 https://developer.android.com/reference/org/xmlpull/v1/XmlPullParser.html

そしてXMLPullParserオブジェクトを持った後、あなたは、このメソッドを呼び出すことができます:あなたはこの例に従うことができ、あなたのファイルからXMLPullParserを作成するには

https://developer.android.com/reference/android/view/LayoutInflater.html#inflate(org.xmlpull.v1.XmlPullParserを、android.view.ViewGroup)を

あなたが必要ビューの親となるViewGroup。ビューをアクティビティにする必要がある場合は、レイアウトで空のアクティビティを作成し、解析されたレイアウトを空のレイアウトに追加することをお勧めします。親なしでレイアウトを拡張しようとしないでください。異なるデバイスで別個の結果を得ることができます。

+1

実際には通知レイアウトですので親はありません:/ – greywolf82

+1

@ greywolf82 NotificationBuilderはRemoteViewsを期待しています。私はあなたが空のレイアウトファイル(ビューグループだけ)とLayoutFormatからインフレータブルビューを追加するaddView(View)メソッドを使用した後にRemoteViewsを作成できると思います。また、RemoteViewを親として使用することもできます。 – jonathanrz

+2

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

関連する問題