7

この質問<merge>のフォローアップとして、含まれているすべてのXMLレイアウトをペア でラップするべきではない理由は考えられません。

それでは、なぜADTチームはこれをデフォルトの動作にしないのか疑問に思います。

この振る舞いを望まない場合はありますか?

ちなみに、タグのAndroidドキュメントの説明は<merge>、最悪の法的合意の文言よりも悪いです。

この<merge />タグは、あるレイアウトを別のレイアウトに含めるときに、ビュー階層内の冗長なビューグループを排除するのに役立ちます。たとえば、メインレイアウトが、LinearLayout2つの連続するビューを複数のレイアウトで再利用できる垂直方向の場合、2つのビューを配置する再利用可能なレイアウトには、独自のルートビューが必要です。ただし、LinearLayout再利用可能なレイアウトのルートとして別のものを使用すると、垂直方向のLinearLayout内側に垂直方向が作成されLinearLayoutます。ネストされたLinearLayoutものは、UIのパフォーマンスを低下させる以外の実際の目的には役立ちません。

ロマン、どこにいるの?

4

1 に答える 1

8

タグの主な目的include(私が見ているように)は、開発者が再利用可能なxmlコンポーネントを作成して、同じアクティビティで、またはアプリ内の多くのアクティビティで複数回使用できるようにすることです。その再利用可能なコンポーネントが本当に有用であるためには、それは自己完結型であり、可能な限り最小限の外部接続を備えている必要があります。私の見解では、merge含まれている各レイアウトでタグを使用すると、includeタグ全体の有用性が低下します。これが起こると思う理由の例を次に示します。

ActionBar再利用可能なxmlコンポーネントを実装して、各アクティビティに埋め込むことを検討してください。とが含まれ、水平に配置されますTextViewButtonこれを行うためのレイアウトは次のようになります。

R.layout.actionbar

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/actionbar_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/actionbar_action"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

ここで、アプリに2つのアクティビティがあるとします。1つはルートビューがLinearLayout(垂直方向)で、もう1つはルートビューがRelativeLayoutです。上記のレイアウトは簡単に含めることができます(必要な場所に配置するだけです)。もちろん、そこからの現在の要素を考慮してLinearLayout、同じことが可能です(たとえば、を設定する必要があることに注意してください(たとえば、複製)含まれているレイアウトのルートから)他の属性が考慮されるようにするためのタグ)。RelativeLayoutRelativeLayoutlayout_width/heightincludelayout_*

今、あなたの提案を考慮に入れてください。レイアウトは次のようになります。

<merge xmlns:android="http://schemas.android.com/apk/res/android" >

    <TextView
        android:id="@+id/actionbar_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/actionbar_action"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</merge>

私たちのレイアウトを見るとActionBar、それほど多くはわかりません。どこかに含まれるべきとがありますTextViewButtonここで、ルートが垂直方向であるアクティビティについて考えてみLinearLayoutます。レイアウトR.layout.actionbarを単純に含めることはできません。これにより、レイアウトが破損します。レイアウトを希望どおりに表示するには、レイアウトに(水平方向に)ActionBar余分に追加する必要があります。LinearLayoutご覧のとおり、上記の状況(タグなしのレイアウト)ですが、親ルートが垂直方向の場合は常に、merge含まれているレイアウトを水平方向のあるレイアウトでラップすることを忘れないでください。LinearLayoutLinearLayout

ルートがである場合、状況はさらに悪化します。でタグを使用するRelativeLayoutことはできません( RelativeLayoutをマージおよびインクルードで機能させる方法を読むための良い質問ですか? )。繰り返しになりますが、オプションは、タグのない状況にあなたを置くaに埋め込むことです(しかし、今では解決するよりも多くの問題を追加しています)。また、このリンクhttp://code.google.com/p/android/issues/detail?id=2863の最後の部分を読むと、タグの他のバグが明らかになる可能性があります。includemergeRelativeLayoutincludeLinearLayoutmergeinclude

上記の例からわかるように、mergeデフォルトでタグを使用すると、特定の状況で問題が発生する可能性があります。また、現在のシステムは、レイアウトを操作するためのより一貫した方法を表しています(includeルートを使用して通常のレイアウトを作成するのと同じように、タグのレイアウトを作成しますView)。また、mergeタグは最適化であり、パフォーマンスの問題が発生し始めるまで(または、複雑さを犠牲にして、パフォーマンスの最後の低下をすべて絞りたい場合)、最適化を試みる必要はないと思います。ほとんどのアプリは現在のシステムで問題なく動作します。適切な量のビューを備えた3〜4レベルの深さのレイアウトは、merge最適化なしでまったく問題なく動作する可能性があります。

mergeタグのもう1つの問題は、膨らんmerge だときに親にアタッチするために、ルートが根元にある膨らんだレイアウトが必要になることです。レイアウトを膨らませる場合はR.layout.actionbar、親にアタッチする必要があります。

View actionBar = getLayoutInflater().inflate(R.layout.actionbar, root, true);

これが本当の制限であるかどうかはわかりません。まれな状況では、取引を妨げる可能性があります。

include-mergeペアの使用についての私の意見です。

于 2012-09-21T07:16:38.683 に答える