從本文你可以快速了解布局中merge標(biāo)簽的作用揽乱,以及使用。
一允蜈、Merge的作用
The <merge /> tag helps eliminate redundant view groups in your view hierarchy when including one layout within another.
大意是呵扛,merge標(biāo)簽是用來(lái)幫助在視圖樹(shù)中減少重復(fù)布局的,當(dāng)一個(gè)layout包含另外一個(gè)layout時(shí)痢士。
二彪薛、示例
-
不使用merge
layout1.xml
<FrameLayout>
<include layout="@layout/layout2"/>
</FrameLayout>
layout2.xml:
<FrameLayout>
<TextView />
</FrameLayout>
實(shí)際效果:
<FrameLayout>
<FrameLayout>
<TextView />
</FrameLayout>
</FrameLayout>
-
使用merge
layout1.xml
<FrameLayout>
<include layout="@layout/layout2"/>
</FrameLayout>
layout2.xml:
<merge>
<TextView />
</merge>
實(shí)際效果:
<FrameLayout>
<TextView />
</FrameLayout>
三茂装、要點(diǎn)
- merge必須放在布局文件的根節(jié)點(diǎn)上。
- merge并不是一個(gè)ViewGroup善延,也不是一個(gè)View少态,它相當(dāng)于聲明了一些視圖,等待被添加易遣。
- merge標(biāo)簽被添加到A容器下彼妻,那么merge下的所有視圖將被添加到A容器下。
- 因?yàn)閙erge標(biāo)簽并不是View豆茫,所以在通過(guò)LayoutInflate.inflate方法渲染的時(shí)候侨歉, 第二個(gè)參數(shù)必須指定一個(gè)父容器,且第三個(gè)參數(shù)必須為true揩魂,也就是必須為merge下的視圖指定一個(gè)父親節(jié)點(diǎn)幽邓。
- 因?yàn)閙erge不是View,所以對(duì)merge標(biāo)簽設(shè)置的所有屬性都是無(wú)效的火脉。
四牵舵、心得
- 可以在使用組合控件形式的自定義view中使用。以前不了解merge時(shí)的做法是倦挂,創(chuàng)建類(lèi)畸颅,繼承RelativeLayout,然后創(chuàng)建layout.xml方援,根布局也是RelativeLayout没炒,在然后在布局中寫(xiě)入其他控件,接著就是在自定義view中inflate布局進(jìn)來(lái)犯戏,之后巴拉巴拉一堆邏輯送火。
所以應(yīng)該在xml布局中根節(jié)點(diǎn)可以使用merge來(lái)減少重復(fù)RelativeLayout布局。 - 在AS中無(wú)法預(yù)覽怎么辦笛丙?使用
parentTag
指定被裝在的parent的布局容器類(lèi)型漾脂,例如tools:parentTag="android.widget.FrameLayout"
,那么就可以預(yù)覽到當(dāng)前布局被裝在進(jìn)FrameLayout時(shí)候的效果
五胚鸯、后記
如有不足之處骨稿,請(qǐng)多多指教。
參考:
官方文檔
What is the purpose of Android's <merge> tag in XML layouts?
Android 布局優(yōu)化之include與merge