Android 4.0的SDK已经发布,在众多的新增特性中,其中对开发者来说比较重要的特性之一,是新增的两种界面布局方式:Space和Gridlayout,它们跟以往Android版本的sdk有什么不同之处?它们能给Android的布局设计带来什么好处?本文将带大家一探android 4.0新增的space及gridlayout布局的相关特性。

  概述

  在Android中,使用的最多的布局是LinearLayout了,它可以让布局界面中的子控件以常见的方式比如水平或者垂直方向对齐。在使用LinearLayout时,开发者应该会记得,会经常遇到复杂的布局结构,所以会时常使用各种LinearLayout进行嵌套,而且应该注意嵌套层次不要过多。

  有很多不错的文章(比如有:Android Layout Tricks #1, Flattening The Stack)小结了嵌套布局的缺点,归纳有如下三类:

  · 不能同时在X,Y轴方向上进行控件的对齐。

  · 当多层布局嵌套时会有性能问题。

  · 不能稳定地支持一些支持自由编辑布局的工具。

  如下图,可以看出上述说的第一个缺点:

  这里,当Email address这个标签的文本发生变化时,既要保持跟其右边控件的下部的基线对齐,又要保持跟下面的控件的右边缘对齐,而用嵌套布局的方式是不能实现的,因为不能够同时在X,Y轴上进行控件的对齐。于是我们便需要引入新的布局方式GridLayout。

  GridLayout布局

  在Android 4.0中,新引入的GridLayout网格布局,就是为了解决上述的问题而新出现的,它把布局以行和列进行分割,如下图:

  可以看到,在这种布局界面中,Email address这个文本标签既属于一个在基线底部对齐的行,也属于一个靠右对齐的列。.

  GridLayout布局使用虚细线将布局划分为行,列和单元格,如上图,也支持一个控件在行,列上都有交错排列。而GridLayout使用的其实是跟LinearLayout类似的API,只不过是修改了一下相关的标签而已,所以对于开发者来说,掌握GridLayout还是很容易的事情。

  在Android 4.0的SDK中,给出了相关的例子,代码位置在:

  samples/ApiDemos/src/com/example/android/apis/view/GridLayout0.java

  samples/ApiDemos/res/layout/grid_layout_1.xml

  下面是一个上图布局的XML例子,代码如下:

<?xml version="1.0" encoding="utf-8"?>

<GridLayout

        xmlns:android="http://schemas.android.com/apk/res/android"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:useDefaultMargins="true"

        android:alignmentMode="alignBounds"

        android:columnOrderPreserved="false"

        android:columnCount"

        >

    <TextView

            android:text="Email setup"

            android:textSize="32dip"

            android:layout_columnSpan"

            android:layout_gravity="center_horizontal"

            />

    <TextView

            android:text="You can configure email in just a few steps:"

            android:textSize="16dip"

            android:layout_columnSpan"

            android:layout_gravity="left"

            />

    <TextView

            android:text="Email address:"

            android:layout_gravity="right"

            />

    <EditText

            android:ems"

            />

    <TextView

            android:text="Password:"

            android:layout_column"

            android:layout_gravity="right"

            />

    <EditText

            android:ems"

            />

    <Space

            android:layout_row"

            android:layout_column"

            android:layout_columnSpan"

            android:layout_gravity="fill"

            />

    <Button

            android:text="Next"

            android:layout_row"

            android:layout_column"

            />

</GridLayout>

  在上面的代码中,要注意的是在GridLayout 布局中,已经不需要使用WRAP_CONTENT和MATCH_PARENT等属性了。要注意的是,在上面的代码中,并没有显式地说明哪个控件摆放在什么单元格,每一个控件其实是使用了layout_columnSpan及rowSpan或columnSpan去指定其相关的位置和宽度。如在上述代码中,首先用

  android:columnCount="4"指定了有4列,列的编号注意从左到右,第一列是0,如此类推。行的编号从上到下,序号也是从0开始。比如上图界面中的最下方的按钮,使用

  android;layout_row=”5”及android:layout_column=’3”指定了其按钮的位置位于第6行第4列。

  而space是Android 4.0中新增的一个控件,它实际上可以用来分隔不同的控件,其中形成一个空白的区域。这个例子中,同样通过android:layout_row及android:layout_column指定了其起始位置。

  下面再看一个例子,代码如下:

    <?xml version="1.0" encoding="utf-8"?> 

<GridLayout

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:columnCount"

    android:rowCount" > 

    <TextView

        android:text="1,1" /> 

    <TextView

        android:text="1,2" /> 

    <TextView

        android:text="1,3" /> 

    <TextView

        android:text="1,4" /> 

    <TextView

        android:text="2,1" /> 

    <TextView

        android:text="2,2" /> 

    <TextView

        android:text="2,3" /> 

    <TextView

        android:text="2,4" /> 

    <TextView

        android:text="3,1" /> 

    <TextView

        android:text="3,2" /> 

    <TextView

        android:text="3,3 longer" /> 

    <TextView

        android:text="3,4" /> 

    <TextView

        android:text="4,1" /> 

    <TextView

        android:text="4,2" /> 

    <TextView

        android:text="4,3" /> 

    <TextView

        android:text="4,4" /> 

</GridLayout>

  运行结果如下图所示:

  可以看到,在gridlayout中,默认的布局是水平方向的,即将控件从左到右,从上到下进行排列,比如上图中的文本“1,2”即放置在第1行第2列中,如此类推。可以看到,其中的文本“3,3”的位置是拉伸了没跟其他控件对齐,要实现控件间的对齐,可以通过

  设置android:layout_gravity=”fill_horizontal”,代码如下:

     <?xml version="1.0" encoding="utf-8"?> 

<GridLayout

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:columnCount"

    android:rowCount" > 

    . 

    . 

    . 

    <TextView

        android:layout_gravity="fill_horizontal"

        android:text="1,3" /> 

    . 

    . 

    . 

    <TextView

        android:layout_gravity="fill_horizontal"

        android:text="2,3" /> 

    . 

    . 

    . 

    <TextView

        android:layout_gravity="fill_horizontal"

        android:text="3,3 longer" /> 

    . 

    . 

    . 

    <TextView

        android:layout_gravity="fill_horizontal"

        android:text="4,3" /> 

</GridLayout>

  运行结果如下图:

  如果需要使用垂直的布局,可以设定android:orientation="vertical",如下代码:

  <GridLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:columnCount"

    android:rowCount"

    android:orientation="vertical" > 

  运行结果如下图:

  可以看到,这次的控件排列顺序是先从上到下排列,比如“1,2”文本框位于“1,1”的下方,如此类推。要注意一点时,如果在gridviewlayout布局中,显式指定某一个控件位于哪一行哪一列(通过使用layout_row或者layout_column),要注意其后的布局的控件则会跟随着位置移动,比如如下的代码:

  <TextView

    android:layout_gravity="fill_horizontal"

    android:layout_row"

    android:text="1,3"/>

  运行效果如下图:

  可以看到,由于文本控件“1,3”被设置成 android:layout_row="1",所以该控件被移动到第2行(注意layout_row的序号从0开始),而其他各控件的位置也相对偏移了。

  接下来,我们看下其中的layout_gravity属性和gravity属性。例子如下代码:

    <GridLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:columnCount"

    android:rowCount"> 

  

    <TextView

        android:text="1,1" /> 

  

    <TextView

        android:text="1,2" /> 

  

    <TextView

        android:layout_gravity="fill_horizontal"

        android:layout_rowSpan"

        android:text="1,3"/> 

  

    <TextView

        android:layout_row"

        android:text="1,4" /> 

  

    <TextView

        android:text="2,1" /> 

  

    <TextView

        android:text="2,2" /> 

  

    <TextView

        android:layout_row"

        android:text="2,4" /> 

  

    <TextView

        android:text="3,1" /> 

  

    <TextView

        android:text="3,2" /> 

  

    <TextView

        android:layout_gravity="fill_horizontal"

        android:text="3,3 longer" /> 

  

    <TextView

        android:text="3,4" /> 

  

    <TextView

        android:text="4,1" /> 

  

    <TextView

        android:text="4,2" /> 

  

    <TextView

        android:layout_gravity="fill_horizontal"

        android:text="4,3" /> 

  

    <TextView

        android:text="4,4" /> 

  </GridLayout>

  再运行,可以看到运行结果如下:

  可以看到,这次文本控件通过使用android:layout_gravity=”fill”,成功地伸展充满了被包含的父控件。如果要让文字“1,3”放置在单元格的正中央的话,可以再通过如下代码设置;

  android:layout_gravity="fill"

  android:gravity="center"

  android:layout_rowSpan="2"

  android:text="1,3"/>

  运行后如下图:

  可以看到,要让文字居中,只需要设置 android:gravity="center"属性即可。

  最后,我们来看下一个例子,在这个例子中,分别用LinearLayout和GridLayout布局,实现了同样的功能,代码如下:

   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:orientation="vertical" > 

  

    <LinearLayout

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:gravity="center_vertical"

        android:orientation="horizontal" > 

  

        <ImageView

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:src="@drawable/ic_launcher" /> 

  

        <LinearLayout

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_weight"

            android:orientation="vertical" > 

  

            <TextView

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:text="Line 1" /> 

  

            <TextView

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:text="Line 2" /> 

        </LinearLayout> 

  

        <TextView

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text=">" /> 

    </LinearLayout> 

  

    <GridLayout

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:columnCount"

        android:rowCount" > 

  

        <ImageView

            android:layout_gravity="fill"

            android:layout_rowSpan"

            android:src="@drawable/ic_launcher" /> 

  

        <TextView

            android:layout_gravity="fill"

            android:text="Line 1" /> 

  

        <TextView

            android:layout_gravity="fill_vertical"

            android:layout_rowSpan"

            android:gravity="fill"

            android:text=">" /> 

  

        <TextView

            android:layout_gravity="fill"

            android:text="Line 2" /> 

    </GridLayout> 

  运行后,结果如下图:

  在这个例子中,可以看到,gridlayout比较简单方便,效率也高,性能比普通的Linearlayout要好,因为 Linearlayout有时要涉及到多层的嵌套,影响渲染性能。

  小结

  在本文中,简要介绍了在Android 4.0中新增的Gridviewlayout布局的基本使用知识和技巧。Gridviewlayout布局由于其简单易用的特点,因此建议开发者在设计布局时,优先考虑使用,避免使用多层嵌套的布局。目前该布局只能在4.0中使用,据说不久的将来将会在补充支持包中能增加让低版本的Android SDK支持gridviewlayout布局的功能。

Android 4.0新增Space及GridLayout初谈的更多相关文章

  1. Android 4.0新组件:GridLayout详细说明

    于Android 4.0(API 14)它提供了一个新的组件GridLayout,它继承自Linearlayout,用于执行网络格样式布局. 在某些方面,GridLayout与TableLayout和 ...

  2. Android 7.0 新增功能和api

    Android 7.0 Nougat 为用户和开发者引入多种新功能.本文重点介绍面向开发者的新功能. 请务必查阅 Android 7.0 行为变更以了解平台变更可能影响您的应用的领域. 要详细了解 A ...

  3. Android 4.0 新增的显示数据集的桌面控件

    setRemoteAdapter (int viewId, Intent intent):该方法可以使用 Intent 更新 RemoteViews 中viewId 对应的组件. 上面方法的 Inte ...

  4. Android4.0新增的网格布局

    网格布局由GridLayout代表,它是Android 4.0新增的布局管理器,因此需要在Android 4.0 之后的版本中才能使用该布局管理器.如果希望在更早的Android平台上使用该布局管理器 ...

  5. Android 8.0 功能和 API

    Android 8.0 为用户和开发者引入多种新功能.本文重点介绍面向开发者的新功能. 用户体验 通知 在 Android 8.0 中,我们已重新设计通知,以便为管理通知行为和设置提供更轻松和更统一的 ...

  6. Android开发之深入理解Android 7.0系统权限更改相关文档

    http://www.cnblogs.com/dazhao/p/6547811.html 摘要: Android 6.0之后的版本增加了运行时权限,应用程序在执行每个需要系统权限的功能时,需要添加权限 ...

  7. Android 5.0 API

    Android 5.0 (LOLLIPOP) 为用户和应用开发者提供了新功能.本文旨在介绍其中最值得关注的新 API. 如果您有已发布的应用,请务必看一看 Android 5.0 行为变更,了解您的应 ...

  8. Android 4.0 的 GridLayout

    设计素材代码: 1<?xml version="1.0" encoding="utf-8"?> 2<GridLayout//#http://w ...

  9. Android 5.0 API新增和改进

    开始开发 要构建 Android 5.0 版应用,您必须先下载 Android SDK,然后使用 SDK 管理器下载 Android 5.0 SDK 平台和系统映像. 更新您的目标 API 级别 要进 ...

随机推荐

  1. (转)在server 2008R2组策略设置所有域计算机防火墙都处于更关闭状态

    组策略在域控中相当重要,我们可以下放一个组策略去统一管理下面客户端的配置,具体配置如下: 首先点击开始____管理工具____组策略管理 防火墙关闭完之后我们该如何到客户端验证呢? 首先我们需要现在客 ...

  2. 程序猿必备软件转载自 www.uhdesk.com

    XMLSpy 2012 企业版中文破解版 软件描写叙述: XMLSpy是XML(标准通用标记语言的子集)编辑器,支持WYSWYG.支持Unicode.多字符集,支持Well-formed和Valida ...

  3. HDU 2577 How to Type DP也可以模拟

    http://acm.hdu.edu.cn/showproblem.php?pid=2577 大意: 大家都打过字吧,现在有个有趣的问题:给你一串字符串,有大写有小写,要求你按键次数最少来输出它,输出 ...

  4. [TypeStyle] Use fallback values in TypeStyle for better browser support

    You can increase the browser support of your CSS using fallback values and vendor prefixes. This les ...

  5. Nginx content cache Nginx内容缓存

    原文地址:http://nginx.com/resources/admin-guide/caching/ Nginx content cache Nginx内容缓存 This chapter desc ...

  6. [Phonegap+Sencha Touch] 移动开发72 List列表横向滑动操作(仿QQ列表滑动删除)

    原文链接:http://blog.csdn.net/lovelyelfpop/article/details/50425744 本插件有2个版本号:sencha touch 版本号和 extjs6 m ...

  7. 服务器负载均衡lvs(Linux Virtual Server)

    服务器负载均衡lvs(Linux Virtual Server) 一.总结 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统. 三.Linu ...

  8. 神经网络 vs 大脑

    海马区域(负责记忆的关键区域) 0. 常见概念 神经递质:neurotransmitter 在突触传递中是担当"信使"的特定化学物质.简称递质. 重要的神经递质有:乙酰胆碱: 1. ...

  9. 机器学习01-kNN邻近算法

    k-近邻算法 概述:k-近邻算法採用測量不同特征值之间的距离方法进行分类 长处:精度高.对于异常值不敏感.无数据输入假定 缺点:计算复杂度高,空间复杂度高,而且它没有办法各处基础数据的一些内部信息数据 ...

  10. MinGW 与MSVC的区别

    Qt 中有两种方式编译,一种是MinGW ,另一种MSVC. 其中:MSVC是指微软的VC编译器 MingGW是指是Minimalist GNU on Windows的缩写.它是一个可自由使用和自由发 ...