你应该知道的布局和属性


这是一个老生常谈的问题了:

[What layout should I be using?](http://stackoverflow.com/search?q=what+layout+should+I+use+%5Bandroid%5D&utm_campaign=android_series_layoutattributes_012116&utm_source=medium&utm_medium=blog)

对于一个Android开发者,知道如何将你印象中的界面(设计师给你的草图)转化成实际中的布局界面是十分重要的技能。

什么是布局?

仅仅是浏览developer.android.com查找Layout,你会发现很多以Layout结尾的类。他们都有什么共同点呢?他们都是ViewGroup的子类 - 一个支持添加子视图(通常被称为子视图)的View

正如你所想象的,一个ViewGroup的主要职责之一是对子视图进行布局:每个View有多大(以下简称measure)和将View放置ViewGroup内(以下简称layout阶段)。

注意:那并不是ViewGroup所有的事。当然,这可以有自己的定制行为,绘制自己以及子View。例如Toolbar除了支持子视图,他还有很多内置的功能。

毫无疑问,你会选择较为合适的布局,布置子视图的位置,这是十分关键的。错误的布局可能会完成不了当前的布局或者性能不一定很好,而较好的布局可以知道简化事件的效果。

Layout_ Attributes

和View一样,ViewGroup可以使用XML属性,如LinearLayout的android:orientation,改变他们的子View的布局,但是,这些属性将会引发每一个子View的变化。为了防止子视图间的递归传递,布局使用了不同的机制向子视图中添加使用形如layout_的属性。这些属性是关于父布局的属性说明,和View本身无关,我们可以从之前写的建议中找到一个例子。

  <android.support.design.widget.AppBarLayout>
    <android.support.v7.widget.Toolbar
      app:layout_scrollFlags="scroll|enterAlways" />
  </android.support.design.widget.AppBarLayout >

如果你查看Toolbar,你不会找到任何和layout_scrollFlags有关的信息。但是你可以在AppBarLayout找到。这些布局属性实际存储在LayoutParams(在这个案例中,是子类AppBarLayout.LayoutParams)。当视图附属在parent View时,就有和parent相关的LayoutParams,它存储着和布局位置相关的信息。默认情况下,这只是一个宽度和高度(即你可以在每一个视图中找到layout_width和layout_height),但每个ViewGroup中都可以在自己的LayoutParams的子类,声明新的属性(具体描述请见文档

:从XML文件中加载视图却传递参数parent(也就是调用LayoutInflater.inflate()中的parent=null),这是一个不好的习惯,因为没有这个参数,有没有人来解析和创建适当的LayoutParams对象,这就意味着所有的属性都扔掉 - 这可能不是你想要的。

常用的AndroidLayouts

大概知道文档中的LayoutParams和layout_ 属性足以帮助您选择合适的布局,但要是一个快速的总结再好不过了。

LinearLayout

LinearLayout的功能比较单一:按照单一的行或列布局(具体取决于android:orientationhorizontal 还是 vertical)。

即便如此,LinearLayout只有一个方向,但是它还有一个绝招:layout_weight ,允许子View的大小拓展以填满整个布局——当你有一部分view是自适应时,而而其他需要尽可能多的空间时,它是非常有用的。

FrameLayout

相比LinearLayout,FrameLayout的行为就大相径庭了:这里所有的View都压在一起绘制。位置的唯一控制要素就是layout_gravity - 可以将View放置在FrameLayout的一侧或中心。

RelativeLayout

RelativeLayout几乎没有前面两个那么简单:看看RelativeLayout.LayoutParams,关于子view和RelativeLayout或者其他View的[位置关系](http://developer.android.com/guide/topics/ui/layout/relative.html?utm_campaign=android_series_layoutattributes_012116&utm_source=medium&utm_medium=blog#Position(例如一个view放置在另一个view下面),就有一大堆的属性(实际上和FrameLayout类似的)。

这具有非常强大的的优势(子View之间可以相互依赖),但是注意布局的性能

PercentFrameLayout 和 PercentRelativeLayout

作为Percent Support Library的成员,PercentFrameLayoutPercentRelativeLayout 允许你使用基于百分比的尺寸来设置尺寸或者margin,你可以使用layout_widthPercent=”50%”表示布局的一半,而无须其思考具体的值。

它们还有一个最令人振奋的功能:支持纵横比ratio,使得它可以指定单个尺寸(高度或宽度)和与之对应的固定纵横比来指定尺寸。甚至对于一个维度上的wrap_content或match_parent它也是起作用的!

GridLayout

2011年的Ice Cream Sandwich,我们引入了GridLayout,但现在它是Support库的一部分(支持API 7)。支持将View防止在任意行和列,并和LinearLayout一样支持权重(weight),可以让你的层级变浅,同时避免由于使用RelativeLayout带来的复杂布局和性能下降。

不像大多数的布局,GridLayout不要求子View有layout_height和layout_width每个视图 - 列和行会根据基线 调整布局。
如果你想研究这个组件,我强烈建议你阅读GridLayout.LayoutParams的文档和博客 (注意,文章是在GridLayout有了layout_weight属性之前写的)。

CoordinatorLayout

CoordinatorLayout,是Android Design Support Library中FrameLayout的子类,除了可以使用layout_gravity控制子View的位置外,还提供了Behavior的概念。

通过给View添加 @DefaultBehavior 注解、使用布局属性layout_behavior或者调用方法setBehavior()可以给View添加behavior可以在子view之前拦截事件(包括measurement, layout, nested scrolling, touch events, 根据依赖的view做出对应的更改以及window insets)。

深入理解Behaviors,请看博客Intercepting everything with CoordinatorLayout Behaviors

Layouts, layouts, layouts

即使你只使用上述的一部分布局,你也可以搭建出很多高性能且易于维护的界面。剩下的时间,你可以针对特定的布局思考一下是否存在更简单的布局方式或者使用自定义视图(或者考虑一下扩展性)。

不论怎么样,使用正确的布局和布局属性可以帮助我们更好的构建应用。

更多信息,请关注Android Development Patterns Collection

Android安全概述

Android 安全架构的理解不仅帮助我了解 Android 的工作原理,而且为我开启了如何构建移动操作系统和 Linux 的眼界。 本章从安全角度讲解 Android 架构的基础知识。 在第 1....

发布于:1年以前  |  1630次阅读  |  详细内容 »

Android Linux 内核层安全

作为最广为人知的开源项目之一,Linux 已经被证明是一个安全,可信和稳定的软件,全世界数千人对它进行研究,攻击和打补丁。 不出所料,Linux 内核是 Android 操作系统的基...

发布于:1年以前  |  1378次阅读  |  详细内容 »

Android 本地用户空间层安全

本地用户空间层在 Android 操作系统的安全配置中起到重要作用。 不理解在该层上发生了什么,就不可能理解在系统中如何实施安全架构决策。 在本章中,我们的主题是 Android ...

发布于:1年以前  |  1109次阅读  |  详细内容 »

Android 框架层安全

如我们在第1.2节中所描述的那样,应用程序框架级别上的安全性由 IPC 引用监视器实现。 在 4.1 节中,我们以 Android 中使用的进程间通信系统的描述开始,讲解这个级别上的...

发布于:1年以前  |  1312次阅读  |  详细内容 »

Android 应用层安全

虽然在这一节中我们描述了应用层的安全性,但是实际的安全实施通常出现在到目前为止描述的底层。 但是,在介绍应用层之后,我们更容易解释 Android 的一些安全功能。 5.1 ...

发布于:1年以前  |  1957次阅读  |  详细内容 »

Android 安全的其它话题

在本章中,我们会涉及到与 Android 安全相关的其他主题,这些主题不直接属于已经涉及的任何主题。 6.1 Android 签名过程 Android 应用程序以 Android 应用包文件(.apk文件...

发布于:1年以前  |  1511次阅读  |  详细内容 »

数据绑定(Data Binding)-Part5

原文链接 : Data Binding - Part 5 直到现在,我们已经见识到Data Binding的很多功能了。但是还有一个很强大的特点没有介绍,那就是观察者模式的应用。 观察者模式在数据会...

发布于:1年以前  |  1020次阅读  |  详细内容 »

在Android 5.0中使用JobScheduler

原文链接 : using-the-jobscheduler-api-on-android-lollipop 在这篇文章中,你会学习到在Android 5.0中如何使用JobScheduler API。JobScheduler API允许开发者在符合某些...

发布于:1年以前  |  907次阅读  |  详细内容 »

Code Review最佳实践

原文链接 : Code Review Best Practices 在Wiredrive上,我们做了很多的Code Review。在此之前我从来没有做过,这对于我来说是一个全新的体验,下面来总结一下在Code Revie...

发布于:1年以前  |  1118次阅读  |  详细内容 »

从Dex到源代码(伪代码)

这个系列的头两篇文章中,我写了两篇关于APK format和aapt tool的文章. 在这篇文章中我将重点讲述dex2jar,它是一个作用于Android .dex文件和Java .class文件的工具。已经...

发布于:1年以前  |  1297次阅读  |  详细内容 »

第五章 基于空间的架构

第五章 基于空间的架构 大多数基于网站的商务应用都遵循相同的请求流程:一个请求从浏览器发到web服务器,然后到应用服务器,然后到数据库服务器。虽然这个模式在用户数不...

发布于:1年以前  |  1115次阅读  |  详细内容 »

Retrofit指南

这是一篇关于如何使用Retrofit写一个Android的REST客户端的小教程。 我为什么选择Retrofit? 在使用square的Retrofit之前,我尝试过Volley和AsyncTask。但在使用过Retrofi...

发布于:1年以前  |  1322次阅读  |  详细内容 »

使用Mockito对异步方法进行单元测试

原文链接 : Unit testing asynchronous methods with Mockito 之前我拍着胸脯承诺要维护的我博客,因此才有了这篇文章。但是请忘记我的那些承诺,我今天要写的是关于Mockit...

发布于:1年以前  |  1095次阅读  |  详细内容 »

Android中调试RxJava

原文链接 : Debugging RxJava on Android 调试是查找和分析bug的过程或者预防软件的正确操作出现问题Wikipedia。 当前调试不是一件容易的事情,我们在处理Android的异步操...

发布于:1年以前  |  709次阅读  |  详细内容 »

国内优秀Android学习资源

技术博客 应用开发 博主 博客 备注 任玉刚 CSDN博客 深入Android应用开发,深度与广度兼顾 郭霖 CSDN博客 内容实用,行文流畅,高人气博主 夏安明 CSDN博客 ...

发布于:1年以前  |  1150次阅读  |  详细内容 »

最多阅读

简化Android的UI开发 6月以前  |  166460次阅读
Google Enjarify:可代替dex2jar的dex反编译 1年以前  |  2148次阅读
Android设计与开发工作流 6月以前  |  2106次阅读
Android多渠道打包工具:apptools 1年以前  |  1847次阅读
Android权限 - 第一篇 1年以前  |  1820次阅读
Google Java编程风格规范(中文版) 1年以前  |  1787次阅读
Stetho 1年以前  |  1730次阅读
Android UI基本技术点 1年以前  |  1716次阅读
30分钟搭建一个android的私有Maven仓库 1年以前  |  1631次阅读
2015 Google IO带来的新 Android 开发工具 1年以前  |  1624次阅读
你应该知道的布局和属性 1年以前  |  1575次阅读
Gradle小知识#3:任务的顺序 1年以前  |  1564次阅读
听FackBook工程师讲*Custom ViewGroups* 1年以前  |  1564次阅读
MVP在Android平台上的应用 1年以前  |  1557次阅读