9

最小限の定型コードでレイアウトを再利用または「エイリアス」する方法を見つけたいと思います。

レイアウト エイリアスに関する 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>
4

1 に答える 1

8

最初の手法は機能し<resources>ます。ファイルを正しいフォルダーに配置するだけです。を介してレイアウトを再利用するときのように、valuesフォルダーではなくフォルダーにある必要があります。layout<include>

たとえばeditor.xmllayoutフォルダ内に存在する という名前のレイアウトがあるとします。特殊なレイアウトsmallnormal画面サイズで使用したいとします。繰り返しを気にしない場合は、このレイアウトをコピーしてフォルダーlayout-smallとフォルダーに貼り付け、各フォルダーlayout-normalに名前を付けeditor.xmlます。という名前のファイルが 3 つあることになりますeditor.xml

繰り返したくない場合は、専用のレイアウトをメインlayoutフォルダーに配置し、compact_editor.xml. 次に、フォルダとフォルダに という名前layout.xmlのファイルを作成します。各ファイルは次のようになります。values-smallvalues-normal

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="editor" type="layout">@layout/compact_editor</item>
</resources>

他の 2 つの問題については、ドキュメントの問題を提出しました。

于 2012-10-09T16:10:57.550 に答える