Intereting Posts

Предупреждение: этот <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.

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

Solutions Collecting From Web of "Предупреждение: этот <FrameLayout> можно заменить тегом <merge>"

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

Скажем, например, у вас есть активность, и это макет 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 на <merge>. Если вы используете, то это будет выглядеть.

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

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

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

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

 <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 возьмет дочерние setContentView тега merge и напрямую вставляет их в FrameLayout с @android:id/content . Изучите оба подхода ( FrameLayout vs merge ) с помощью HierarachyViewer чтобы увидеть разницу.

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