在接下来的内容中,将介绍<merge/>标签和<include/>标签的互补使用。<merge/>标签以减少View树的层次来优化Android的布局。通过下面的演示代码,就会很容易的理解这个标签能解决的问题。下面的XML布局代码显示一幅图片,并且有一个标题位于其上方。这个结构相当的简单;FrameLayout里放置了一个ImageView,其上放置了一个TextView。
整段代码的布局渲染起来很漂亮,效果如图5-21所示。当使用Hierarchy Viewer工具来检查时,会发现事情变得很有趣。如果仔细查看View树,将会注意到在XML文件中定义的FrameLayout(高亮显示)是另一个FrameLayout唯一的子元素。如图5-22所示。
图5-21 布局渲染效果
图5-22 优化工具中的提示
既然FrameLayout和它的父元素有着相同的尺寸(归功于fill_parent常量),并且也没有定义任何的background(背景)和额外的padding(边缘),所以它完全是无用的。我们所要做的仅仅是让UI变得更为复杂而已。我们怎样才能摆脱这个FrameLayout呢?毕竟,XML文件需要一个根标签且XML布局总是与相应的View实例相对应,这时候就需要<merge/>标签来实现。当LayoutInflater遇到<merge/>标签时会跳过它,并将<merge/>内的元素添加到<merge/>的父元素里。下面我们用<merge/>来替换FrameLayout,并重写之前的XML布局。
在上述新代码中,TextView和ImageView都直接添加到上一层的FrameLayout里。虽然视觉上看起来一样,但是View的层次更加简单了,此时的UI结构视图如图5-23所示。
图5-23 新的UI结构视图
很显然,在这个场合使用<merge/>标签是因为Activity的ContentView的父元素始终是FrameLayout。如果我们的布局使用LinearLayout作为它的根标签,那么就不能使用这个技巧。<merge/>标签在其他的一些场合也非常很有用。例如,它与<include/>标签结合起来就能表现得很完美。另外我们还可以在创建一个自定义的组合View时使用<merge/>。让我们看一个使用<merge/>创建一个新View的例子——OkCancelBar,它包含两个按钮,并可以设置按钮标签。下面的XML代码用于在一个图片上显示自定义的View:(www.daowen.com)
新的布局效果如图5-24所示。
图5-24 新的布局效果
OkCancelBar部分的代码非常简单,因为这两个按钮在外部的XML文件中定义,通过类LayoutInflate导入。R.layout.okcancelbar以OkCancelBar作为父元素,如下面的演示代码片段所示。
在此使用<merge/>标签直接添加两个按钮到OkCancelBar。每个按钮都是从外部相同的XML布局文件包含进来的,这样做的好处是便于维护,我们只是简单地重写它们的ID。两个按钮的定义如下面的XML代码所示。
由此可见,此时创建了一个灵活且易于维护的自定义View,有着高效的View层次。如图5-25所示。
图5-25 UI结构视图
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。