Предупреждение: этот <FrameLayout> можно заменить тегом <merge>

У меня есть FrameLayout, который содержит TextView и два LinearLayout s:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >


    ... a textview and 2 linearlayouts


</FrameLayout>

После запуска Android Lint я получаю следующее предупреждение: This <FrameLayout> can be replaced with a <merge> tag.

Почему это предупреждение существует? Что я могу сделать, чтобы исправить это (кроме игнорирования)?

Ответ 1

Чтобы понять это, вам нужно понять, как раздуты и размещены макет.

Скажем, например, у вас есть активность, и это макет xml, который вы используете. Вот как выглядит макет действия перед тем, как вы поместите свой файл макета.

<FrameLayout // This is the window
    ...
    <FrameLayout> // This is activity
    </FrameLayout>
</FrameLayout>

В зависимости от устройства/ОС может быть несколько других уровней.

Теперь, когда вы раздуваете ваш файл макета и вставляете его, вот как он будет выглядеть.

<FrameLayout // This is the window
    ...
    <FrameLayout> // This is activity
        // Your layout below
        <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >
                ... a textview and 2 linearlayouts
        </FrameLayout>
    </FrameLayout>
</FrameLayout>

Вы видите FrameLayout внутри FrameLayout? Это избыточно, потому что это не добавляет большого значения. Чтобы оптимизировать, вы можете заменить FrameLayout на < слияние > . Если вы используете, то это будет выглядеть.

<FrameLayout // This is the window
    ...
    <FrameLayout // This is activity
        // Your layout below
                ... a textview and 2 linearlayouts
    </FrameLayout>
</FrameLayout>

Обратите внимание, что дополнительного FrameLayout нет. Вместо этого он просто сливается с FrameLayout активности. Когда вы можете, вы должны использовать < слияние > . Это относится не только к FrameLayouts. Вы можете прочитать больше об этом здесь. http://developer.android.com/training/improving-layouts/reusing-layouts.html#Merge

Надеюсь, что это поможет.

Ответ 2

Используете ли вы это в качестве основного макета своей деятельности? Если это так, вы можете заменить его тегом слияния следующим образом:

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

    ... a textview and 2 linearlayouts


</merge>

В setContentView Android возьмет дочерние элементы тега слияния и напрямую вставляет их в FrameLayout с помощью @android:id/content. Изучите оба подхода (FrameLayout vs merge) с помощью HierarachyViewer, чтобы увидеть разницу.

Ответ 3

Обратитесь этот пост Ромен Гай за дополнительной информацией. Он сообщает вам, почему предлагается вариант слияния.