最小限の定型コードでレイアウトを再利用または「エイリアス」する方法を見つけたいと思います。
レイアウト エイリアスに関する Android ドキュメントは正しくないようで、一貫性がないように見えます。ドキュメントのこのセクションでは、例として次のレイアウト ファイルを示します。
<resources>
<item name="main" type="layout">@layout/main_twopanes</item>
</resources>
これをコンパイルしようとすると、Attribute is missing the Android namespace prefix
エラーが発生します。名前空間をresources
要素に追加した後でも、error: Error: String types not allowed (at 'type' with value 'layout').
Android のドキュメント の他の場所では、レイアウトをエイリアスする別の、一見逆で間違った方法が示されています。
既存のレイアウトへのエイリアスを作成するには、要素を使用し、
<merge>
. 例えば:<?xml version="1.0" encoding="utf-8"?> <merge> <include layout="@layout/main_ltr"/> </merge>
これを実行すると、 LogCat に次のエラーが発生しますE/AndroidRuntime(1558): android.view.InflateException: <merge /> can be used only with a valid ViewGroup root and attachToRoot=true
。<include>
<merge>
したがって、このエラーは、不要な親が必要なため、このペアが間違いに違いないという事実を補強しているようView
です。
最後に<merge>
ドキュメンテーションがありますが、これは以前の方向性と矛盾しているようで、トップレベルの逆形式については言及していません<merge><include/></merge>
。
このような冗長なビュー グループを含めないようにするために、代わりに要素を再利用可能なレイアウトのルート ビューとして使用できます。例えば:
<merge xmlns:android="http://schemas.android.com/apk/res/android"> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/add"/> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/delete"/> </merge>