`
Beyon_javaeye
  • 浏览: 68517 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

布局技巧:合并布局

阅读更多
布局技巧:合并布局
    我们已经有文章向你描述如何使用<include />标签来重用和共享你的布局代码。这篇文章将向你阐述<merge />标签的使用以及如何与<include />标签互补使用。
    <merge />标签用于减少View树的层次来优化Android的布局。通过看一个例子,你就能很容易的理解这个标签能解决的问题。下面的XML布局显示一个图片,并且有一个标题位于其上方。这个结构相当的简单;FrameLayout里放置了一个ImageView,其上放置了一个TextView:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ImageView  
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:scaleType="center"
        android:src="@drawable/golden_gate" />
    <TextView
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_marginBottom="20dip"
        android:layout_gravity="center_horizontal|bottom"
        android:padding="12dip"
        android:background="#AA000000"
        android:textColor="#ffffffff"
        android:text="Golden Gate" />
</FrameLayout>

    布局渲染起来很漂亮,而且看不出有什么问题:

    当你使用HierarchyViewer工具来检查时,你会发现事情变得很有趣。如果你仔细查看View树,你将会注意到,我们在XML文件中定义的FrameLayout(蓝色高亮显示)是另一个FrameLayout唯一的子元素:

    既然我们的FrameLayout和它的父元素有着相同的尺寸(归功于fill_parent常量),并且也没有定义任何的background,额外的padding或者gravity,所以它完全是无用的。我们所做的,只是让UI变得更为复杂。怎样我们才能摆脱这个FrameLayout呢?毕竟,XML文档需要一个根标签且XML布局总是与相应的View实例想对应。
    这时候,<merge />标签闪亮登场了。当LayoutInflater遇到这个标签时,它会跳过它,并将<merge />内的元素添加到<merge />的父元素里。迷惑了吗?让我们用<merge />来替换FrameLayout,并重写之前的XML布局:
<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <ImageView  
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:scaleType="center"
        android:src="@drawable/golden_gate" />
    <TextView
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_marginBottom="20dip"
        android:layout_gravity="center_horizontal|bottom"
        android:padding="12dip"
        android:background="#AA000000"
        android:textColor="#ffffffff"
        android:text="Golden Gate" />
</merge>

    新的代码中,TextView和ImageView都直接添加到上一层的FrameLayout里。虽然视觉上看起来一样,但View的层次更加简单了:

    很显然,在这个场合使用<merge />是因为Activity的ContentView的父元素始终是FrameLayout。如果你的布局使用LinearLayout作为它的根标签(举例),那么你就不能使用这个技巧。<merge />在其它的一些场合也很有用的。例如,它与<include />标签结合起来就能表现得很完美。你还可以在创建一个自定义的组合View时使用<merge />。让我们看一个使用<merge />创建一个新View的例子——OkCancelBar,包含两个按钮,并可以设置按钮标签。下面的XML用于在一个图片上显示自定义的View:
<merge
    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:okCancelBar="http://schemas.android.com/apk/res/com.example.android.merge">
    <ImageView  
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:scaleType="center"
        android:src="@drawable/golden_gate" />
    <com.example.android.merge.OkCancelBar
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_gravity="bottom"
        android:paddingTop="8dip"
        android:gravity="center_horizontal"
        android:background="#AA000000"
        okCancelBar:okLabel="Save"
        okCancelBar:cancelLabel="Don't save" />
</merge>

     新的布局效果如下图所示:

     OkCancelBar的代码很简单,因为这两个按钮在外部的XML文件中定义,通过LayoutInflate类导入。如下面的代码片段所示,R.layout.okcancelbar以OkCancelBar为父元素:
public class OkCancelBar extends LinearLayout {
    public OkCancelBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        setOrientation(HORIZONTAL);
        setGravity(Gravity.CENTER);
        setWeightSum(1.0f);
        
        LayoutInflater.from(context).inflate(R.layout.okcancelbar, this, true);
        
        TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.OkCancelBar, 0, 0);
        
        String text = array.getString(R.styleable.OkCancelBar_okLabel);
        if (text == null) text = "Ok";
        ((Button) findViewById(R.id.okcancelbar_ok)).setText(text);
        
        text = array.getString(R.styleable.OkCancelBar_cancelLabel);
        if (text == null) text = "Cancel";
        ((Button) findViewById(R.id.okcancelbar_cancel)).setText(text);
        
        array.recycle();
    }
}

    两个按钮的定义如下面的XML所示。正如你所看到的,我们使用<merge />标签直接添加两个按钮到OkCancelBar。每个按钮都是从外部相同的XML布局文件包含进来的,便于维护;我们只是简单地重写它们的id:
<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <include
        layout="@layout/okcancelbar_button"
        android:id="@+id/okcancelbar_ok" />        
    <include
        layout="@layout/okcancelbar_button"
        android:id="@+id/okcancelbar_cancel" />
</merge>

    我们创建了一个灵活且易于维护的自定义View,它有着高效的View层次:

    <merge />标签极其有用。然而它也有以下两个限制:
    ·<merge />只能作为XML布局的根标签使用
    ·当Inflate以<merge />开头的布局文件时,必须指定一个父ViewGroup,并且必须设定attachToRoot为true(参看inflate(int, android.view.ViewGroup, Boolean)方法)。
  • 大小: 24.8 KB
  • 大小: 303.4 KB
  • 大小: 21 KB
  • 大小: 29.7 KB
  • 大小: 285.6 KB
分享到:
评论

相关推荐

    三维数字化技术综合应用:合并场景.pdf

    总结来说,掌握三维数字化技术中的合并场景技巧,不仅能够优化个人的工作流程,还能促进团队之间的高效协作,是每个从事三维设计和数据分析的专业人士必备的技能之一。通过不断地实践和学习,你将更加熟练地运用这一...

    Android布局技巧之合并布局

    本文将深入探讨Android布局技巧之合并布局,通过使用标签来减少视图层次,从而提高性能和优化用户体验。 首先,我们来理解一下标签的作用。在Android开发中,布局文件通常包含多个视图层级结构,这在某些情况下会...

    CSS+DIV网页布局技巧(精髓)

    ### CSS+DIV网页布局技巧(精髓) #### 一、消除列表样式 为了使网页看起来更加整洁,我们常常需要去掉无序列表(`&lt;ul&gt;`)和有序列表(`&lt;ol&gt;`)中的默认列表符号。 ##### 方法一:设置 `list-style-type` 为 `...

    (完整word版)全国计算机一级MS+WORD操作试题(10套).doc

    * 协作和分享技巧:包括文件的分享、比较和合并等协作技巧。 知识点五:计算机一级考试 MS Office 操作试题 * WORD 操作题:包括 WORD 文档的操作、格式设置和编辑等技巧。 * EXCEL 操作题:包括 EXCEL 表格的操作...

    android布局技巧

    ### Android布局技巧详解 在Android应用开发中,布局设计是构建用户界面的关键步骤。良好的布局不仅能够提升用户体验,还能优化应用性能。本文将深入探讨Android布局的技巧,帮助开发者掌握如何利用基本布局组件...

    CSS网站布局实录内含各色css布局样式

    本资源“CSS网站布局实录内含各色css布局样式”是一个全面的教程,旨在帮助初学者和经验丰富的开发者掌握各种CSS布局技巧。下面我们将深入探讨其中的关键知识点。 一、CSS基础 1. 选择器:CSS通过选择器来定位HTML...

    winform VS窗口布局的框架 灵活拖拽布局

    通过理解并掌握DockPanel Suite的这些特点和使用技巧,开发者能够构建出更加灵活、用户友好的Winform应用程序。无论是简单的桌面应用还是复杂的多窗口系统,DockPanel Suite都是一个强大而实用的布局解决方案。

    50个相见恨晚的CAD技巧总结

    4. 多段线合并技巧: - 输入PE指令,通过Y选项确认后输入J选择需要合并的线段,完成合并操作。 5. 填充无效解决技巧: - 去OP选项中检查应用实体填充是否勾选,确保连续选择多个物体的设置正确。 6. 加选无效...

    css网站开发布局技巧

    本文将深入探讨“CSS网站开发布局技巧”,旨在帮助开发者掌握有效的设计策略,提升网站的用户体验。 首先,我们需要理解CSS的基本布局模式。传统的布局方式有流体布局、固定布局和响应式布局。流体布局允许页面元素...

    div+CSS 网页布局教程.网站开发,网页制作

    二、div+CSS布局常用方法与技巧: 1. **浮动布局(floats)**:通过设置元素的`float`属性,可以让元素在页面上浮动,实现多列布局。 2. **定位布局(positioning)**:使用`position`属性可以精确控制元素的位置,...

    js 合并单元格2例

    在JavaScript(简称js)中,对HTML表格(table)进行单元格(cell)合并是常见的需求,这在创建复杂布局或者展示数据时尤其有用。...理解这些基础知识和技巧,能帮助我们在开发中更高效地处理表格数据和布局。

    asp.net css样式布局

    3. CSS布局技巧: - 盒模型:理解CSS盒模型是布局的关键,它包括元素的内容区域、内边距、边框和外边距。 - 浮动布局:`float`属性用于使元素浮动,常用于创建多列布局。 - 定位:`position`属性(如static、...

    DIV+CSS网页布局技巧实例

    ### DIV+CSS网页布局技巧实例详解 #### 实例1:设置网页整体居中 在早期的网页设计中,使用表格布局来实现页面居中是非常直观且便捷的方式。但在现代网页设计中,更多采用的是`DIV+CSS`布局,这就需要掌握不同的...

    Div+CSS网页样式与布局从入门到精通 实例

    7. **性能优化**:学习CSS性能优化技巧,如减少选择器的复杂性、合并CSS规则、合理利用CSS预处理器等,提高页面加载速度和用户体验。 8. **响应式设计**:随着移动设备的普及,响应式设计是必不可少的技能。通过CSS...

    办公软件技能大赛.pdf

    * 单元格行和列操作技巧:合并单元格、行高列宽的调整等 * 公式与函数技巧:公式应用、数据处理及排序等 * 数据图表化技巧:建立图表、图表的修改等 三、办公软件技能大赛的意义 * 准备学生日后工作与发展的竞争力...

    dataGridView表头合并列

    然而,有时我们需要对表头进行更复杂的布局,比如合并列来呈现层次化的信息。标题"dataGridView表头合并列"所描述的就是这个需求:如何在`DataGridView`中实现表头的多级或合并列。 首先,我们要明白,`...

    CSS网站布局与开发技巧

    本主题将深入探讨“CSS网站布局与开发技巧”,帮助你掌握创建美观、响应式的网站布局的关键技术。 一、盒模型与流体布局 CSS盒模型是理解布局的基础,它包括内容(content)、内边距(padding)、边框(border)和外边距...

    精通CSS+DIV网页样式与布局书中实例

    2. CSS页面布局:CSS提供了多种布局模式,包括流体布局、固定布局、响应式布局等。流体布局允许页面元素根据浏览器窗口大小自动调整,而固定布局则保持元素尺寸不变,适合屏幕分辨率统一的情况。响应式布局则结合...

Global site tag (gtag.js) - Google Analytics