<merge/>
полезен, потому что он может избавиться от ненужных ViewGroups, то есть макетов, которые просто используются, чтобы обернуть другие представления и сами не служат цели.
Например, если вы <include/>
использовали макет из другого файла без слияния, эти два файла могут выглядеть примерно так:
layout1.xml:
<FrameLayout>
<include layout="@layout/layout2"/>
</FrameLayout>
layout2.xml:
<FrameLayout>
<TextView />
<TextView />
</FrameLayout>
который функционально эквивалентен этой единственной компоновке:
<FrameLayout>
<FrameLayout>
<TextView />
<TextView />
</FrameLayout>
</FrameLayout>
Этот FrameLayout в layout2.xml может быть бесполезен. <merge/>
помогает избавиться от этого. Вот как это выглядит при использовании слияния (layout1.xml не меняется):
layout2.xml:
<merge>
<TextView />
<TextView />
</merge>
Это функционально эквивалентно этому макету:
<FrameLayout>
<TextView />
<TextView />
</FrameLayout>
но так как вы используете, <include/>
вы можете использовать макет в другом месте. Его не нужно использовать для замены только FrameLayouts - вы можете использовать его для замены любого макета, который не добавляет чего-либо полезного к тому, как ваш вид выглядит / ведет себя.
<TextView />
ничем другим.Тег включения
<include>
Тег позволяет разделить ваш макет на несколько файлов: это помогает дело с комплексным или слишком длинным пользовательским интерфейсом.Предположим, вы разбили сложный макет, используя два включаемых файла следующим образом:
top_level_activity.xml :
Тогда вам нужно написать
include1.xml
иinclude2.xml
.Имейте в виду, что xml из включаемых файлов просто выгружается в ваш
top_level_activity
макет во время рендеринга (почти как#INCLUDE
макрос для C).Включаемые файлы представляют собой простой jane layout xml.
include1.xml :
... и include2.xml :
Видеть? Ничего особенного. Обратите внимание, что вы все равно должны объявить пространство имен Android с помощью
xmlns:android="http://schemas.android.com/apk/res/android
.Итак, отрендеренная версия top_level_activity.xml :
В вашем java-коде все это прозрачно:
findViewById(R.id.textView1)
в вашем классе активности возвращается правильный виджет (даже если этот виджет был объявлен в xml-файле, отличном от макета активности).И вишня сверху: визуальный редактор справляется с этим плавно. Макет верхнего уровня отображается с включенным xml.
Сюжет утолщается
Поскольку включаемый файл является классическим XML-файлом макета, это означает, что он должен иметь один верхний элемент. Таким образом, если ваш файл должен содержать более одного виджета, вам придется использовать макет.
Допустим,
include1.xml
сейчас их дваTextView
: макет должен быть объявлен. Давайте выберемLinearLayout
.include1.xml :
Top_level_activity.xml будет оказана как:
Но подождите, два уровня
LinearLayout
избыточны !Действительно, два не вложенными
LinearLayout
служат никакой цели , как дваTextView
могут быть включены вlayout1
течение точно так же рендеринга .Так что мы можем сделать?
Введите тег слияния
<merge>
Тег просто фиктивный тег , который обеспечивает верхний элемент для решения такого рода проблемы избыточности.Теперь include1.xml становится:
и теперь top_level_activity.xml отображается как:
Вы сохранили один уровень иерархии, избегая одного бесполезного представления: Romain Guy уже спит лучше.
Разве ты не счастливее сейчас?
источник
RelativeLayout
видов , то, возможно, вы можете использовать или нарисовать виды вручнуюBlazeroni уже дал понять, я просто хочу добавить несколько моментов.
<merge>
используется для оптимизации макетов. Используется для уменьшения ненужных вложений.<merge>
тег, добавляется в другой макет,<merge>
узел удаляется, а его дочернее представление добавляется непосредственно к новому родителю.источник
Чтобы иметь более глубокие знания о том, что происходит, я создал следующий пример. Посмотрите на файлы activity_main.xml и content_profile.xml .
activity_main.xml
content_profile.xml
Здесь весь файл макета при накачке выглядит следующим образом.
Обратите внимание, что внутри родительского LinearLayout есть LinearLayout, который не служит какой-либо цели и является избыточным. Взгляд на макет с помощью инструмента «Инспектор макетов» ясно объясняет это.
content_profile.xml после обновления кода для использования слияния вместо ViewGroup, например LinearLayout.
Теперь наш макет выглядит так
Здесь мы видим, что лишняя LinearLayout ViewGroup удалена. Теперь инструмент Layout Inspector предоставляет следующую иерархию макетов.
Поэтому всегда пытайтесь использовать слияние, когда ваш родительский макет может позиционировать ваши дочерние макеты, или, точнее, использовать слияние, когда вы понимаете, что в иерархии будет избыточная группа представлений.
источник
Другой причиной использования слияния является использование пользовательских групп представлений в ListViews или GridViews. Вместо использования шаблона viewHolder в адаптере списка вы можете использовать пользовательское представление. Пользовательское представление будет раздувать XML, корнем которого является тег слияния. Код для адаптера:
Вот пользовательская группа:
и вот XML:
источник