2012-10-09 11 views
7

私は、少なくとも定型的なコードでレイアウトを再利用したり、 "エイリアス"する方法を理解したいと思います。レイアウトエイリアスに関するAndroidのドキュメントが正しくありませんか?

Android documentation about layout aliasesは間違っており、確かに矛盾しているようです。私はこれをコンパイルしようとすると、私はAttribute is missing the Android namespace prefixエラーを取得する

<resources> 
    <item name="main" type="layout">@layout/main_twopanes</item> 
</resources> 

:ドキュメントのこのセクションでは、例として、次のレイアウトファイルを示しています。使用し、既存のレイアウトにエイリアスを作成するには

:でもresources要素に名前空間を追加した後、私はerror: Error: String types not allowed (at 'type' with value 'layout').

Elsewhere in the Android documentationを取得、彼らは別名のレイアウトに異なると一見反転して間違った道を示します要素 は<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><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> 
+1

[最初のメソッド](http://developer.android.com/training/multiscreen/screensizes.html#TaskUseAliasFilters)はコンパイルされていて、うまく動作しているようです。最新のSDKツールをインストールしていますか? – Joe

+0

@Joeはこれを確認してくれてありがとう!それは私が注意深く指示を読まなかったことに終わります。 layout.xmlを 'values-large'フォルダではなく' layout-large'の中に置いていました。 –

答えて

7

最初の技術は動作しますが、あなただけの正しいフォルダに<resources>ファイルを配置する必要があります。 <include>でレイアウトを再利用する場合は、layoutフォルダではなく、valuesフォルダにある必要があります。

例えば、layoutフォルダにあるeditor.xmlという名前のレイアウトがあるとします。 smallnormalの画面サイズで特殊なレイアウトを使いたいとします。あなたが自分自身を繰り返すことに気をつけなければ、このレイアウトをコピーしてlayout-smalllayout-normalフォルダに貼り付けて、各フォルダにeditor.xmlという名前を付けるだけです。だから、editor.xmlという名前の3つのファイルがあります。

自分自身を繰り返したくない場合は、layoutメインフォルダに特別なレイアウトを置き、たとえばcompact_editor.xmlという名前を付けます。次に、values-smallvalues-normalというフォルダにlayout.xmlという名前のファイルを作成します。各ファイルには次のようになります。私は他の二つの問題についてdocumentation issueを提出してきました

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

+1

"この逆のマージの使用は別の方法では文書化されていないようです" - なぜなら、何らかの理由で ''がルート要素としてサポートされていないという理由が ''です。それ以外の場合は、「」の使用は正常です。 ''は、「ここには不確定な親に入る必要のあるウィジェットとコンテナの束があります。」()がルートXML要素として機能します(XMLには1つ必要なので)。この場合、「ウィジェットとコンテナの束」は別のレイアウトリソースに格納されることになり、したがって、「」となります。 – CommonsWare

+0

@CommonsWareは合理的だと思いますが、これはあなたの理解に基づいたものです。[](実際のドキュメントはありません)(http://developer.android.com/training/improving-layouts/reusing-layouts.html#Merge) 。 –

+0

さて、実際の文書は、賞金を獲得するのに正確なものではありませんが、そこに私が書いたものと矛盾するものは何もありません。 – CommonsWare

関連する問題