<merge/>
é útil porque pode se livrar de ViewGroups desnecessários, ou seja, layouts que são simplesmente usados para agrupar outras visualizações e não servem para nada.
Por exemplo, se você <include/>
usasse um layout de outro arquivo sem usar a mesclagem, os dois arquivos poderiam ter a seguinte aparência:
layout1.xml:
<FrameLayout>
<include layout="@layout/layout2"/>
</FrameLayout>
layout2.xml:
<FrameLayout>
<TextView />
<TextView />
</FrameLayout>
que é funcionalmente equivalente a este layout único:
<FrameLayout>
<FrameLayout>
<TextView />
<TextView />
</FrameLayout>
</FrameLayout>
Esse FrameLayout no layout2.xml pode não ser útil. <merge/>
ajuda a se livrar dele. Veja como é usar a mesclagem (layout1.xml não muda):
layout2.xml:
<merge>
<TextView />
<TextView />
</merge>
Isso é funcionalmente equivalente a este layout:
<FrameLayout>
<TextView />
<TextView />
</FrameLayout>
mas como você está usando, <include/>
pode reutilizar o layout em outro lugar. Ele não precisa ser usado para substituir apenas os FrameLayouts - você pode usá-lo para substituir qualquer layout que não esteja adicionando algo útil à aparência / comportamento da sua exibição.
<TextView />
, nada mais.A tag de inclusão
A
<include>
tag permite dividir seu layout em vários arquivos: ajuda a lidar com problemas complexos interface de usuário ou longa.Suponhamos que você divida seu layout complexo usando dois arquivos de inclusão, como a seguir:
top_level_activity.xml :
Então você precisa escrever
include1.xml
einclude2.xml
.Lembre-se de que o xml dos arquivos de inclusão é simplesmente despejado em seu
top_level_activity
layout no momento da renderização (praticamente como a#INCLUDE
macro para C).Os arquivos de inclusão são xml simples do layout jane.
include1.xml :
... e include2.xml :
Vejo? Nada chique. Observe que você ainda precisa declarar o namespace do Android com
xmlns:android="http://schemas.android.com/apk/res/android
.Portanto, a versão renderizada do top_level_activity.xml é:
No seu código java, tudo isso é transparente:
findViewById(R.id.textView1)
na sua classe de atividade retorna o widget correto (mesmo que esse widget tenha sido declarado em um arquivo xml diferente do layout da atividade).E a cereja no topo: o editor visual lida bem com a coisa. O layout de nível superior é renderizado com o xml incluído.
O enredo engrossa
Como um arquivo de inclusão é um arquivo xml de layout clássico, significa que ele deve ter um elemento superior. Portanto, caso seu arquivo precise incluir mais de um widget, você precisará usar um layout.
Digamos que
include1.xml
agoraTextView
haja dois : um layout deve ser declarado. Vamos escolher aLinearLayout
.include1.xml :
O top_level_activity.xml será renderizado como:
Mas espere que os dois níveis
LinearLayout
sejam redundantes !De fato, os dois aninhados
LinearLayout
não servem para nada, pois os doisTextView
podem ser incluídos exatamentelayout1
para a mesma renderização .Então o que nós podemos fazer?
Digite a tag de mesclagem
A
<merge>
tag é apenas uma tag fictícia que fornece um elemento de nível superior para lidar com esse tipo de problemas de redundância.Agora include1.xml se torna:
e agora top_level_activity.xml é renderizado como:
Você salvou um nível de hierarquia, evita uma visão inútil: o Romain Guy já dorme melhor.
Você não está mais feliz agora?
fonte
RelativeLayout
ou desenhar as visualizações manualmente #O blazeroni já deixou bem claro, só quero acrescentar alguns pontos.
<merge>
é usado para otimizar layouts.É usado para reduzir o aninhamento desnecessário.<merge>
tag é adicionado a outro layout, o<merge>
nó é removido e sua visualização filho é adicionada diretamente ao novo pai.fonte
Para ter um conhecimento mais profundo do que está acontecendo, criei o exemplo a seguir. Dê uma olhada nos arquivos activity_main.xml e content_profile.xml .
activity_main.xml
content_profile.xml
Aqui, o arquivo de layout inteiro quando inflado se parece com isso.
Veja se há um LinearLayout dentro do LinearLayout pai, que não serve a nenhum propósito e é redundante. Uma olhada no layout através da ferramenta Layout Inspector explica claramente isso.
content_profile.xml após atualizar o código para usar a mesclagem em vez de um ViewGroup como LinearLayout.
Agora, nosso layout fica assim
Aqui vemos que o LinearLayout ViewGroup redundante é removido. Agora, a ferramenta Inspetor de layout fornece a seguinte hierarquia de layout.
Portanto, sempre tente usar a mesclagem quando o layout pai puder posicionar os layouts filhos, ou mais precisamente use a mesclagem quando entender que haverá um grupo de visualizações redundantes na hierarquia.
fonte
Outro motivo para usar a mesclagem é ao usar grupos de exibição personalizados em ListViews ou GridViews. Em vez de usar o padrão viewHolder em um adaptador de lista, você pode usar uma exibição customizada. A visualização personalizada aumentaria um xml cuja raiz é uma tag de mesclagem. Código para adaptador:
aqui está o grupo de visualização personalizado:
e aqui está o XML:
fonte