你应该知道的布局和属性


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

[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 安全相关的其他主题,这些主题不直接属于已经涉及的任何主题。 6.1 Android 签名过程 Android 应用程序以 Android 应用包文件(.apk文件...

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

Android 应用层安全

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

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

Android 框架层安全

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

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

Android 本地用户空间层安全

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

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

Android Linux 内核层安全

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

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

Android安全概述

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

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

使用Robolectric的参数化测试

原文链接 : Parameterized testing with Robolectric 在目前的项目中我们使用Robolectric为Android应用程序编写单元测试,它一直都干的不错。最近我需要编写一个测试用例,通...

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

Android MVPR 架构模式-Part1

原文链接 : MVPR: A FLEXIBLE, TESTABLE ARCHITECTURE FOR ANDROID (PT. 1) 全面的单元测试能提高内部系统的代码质量,因为系统的每一个组件都需要被测试,因此每个单元...

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

使用Espresso进行UI测试

原文链接 : Using Espresso for Easy UI Testing 在我和很多Android开发者聊天的时候我注意到他们在开发的过程中并不注重测试这一环节,原因是他们认为Android测试太难实现...

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

从网页中触发Android原生的分享Intent

原文链接 : Triggering a native Share intent on Android from the web 这是很久之前的事了,在我访问了班加罗尔(印度南部城市)的FlipKart以及进行了一场关于是否存在一...

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

Android高性能JSON数据解析

原文链接 : Hi Performance JSON Parsing in Android 有时Android开发中我们调用的1/3的API需要我们下载JSON数据。现在我有一个客户端调用一个API接口用于为设备同步数据。...

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

在Activity中使用Thread导致的内存泄漏

注:这篇博文涉及的源码可以在 GitHub 上面下载哦 做 Android 开发最常遇到的问题就是在 Activity 的生命周期中协调耗时任务,避免执行任务导致不易察觉的内存泄漏。不妨...

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

使用RxJava缓存Rest请求

原文链接 : Subscribe It While It&#039;s Hot: Cached Rest Requests With RxJava 免责声明: 在这篇文章中,我尝试去用正确的方法来解决一个常见的问题。我仍然正在整理我脑袋...

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

使用ACTION_PROCESS_TEXT创建自定义文本选择动作

原文链接 : Creating custom Text Selection actions with ACTION_PROCESS_TEXT 使用ACTION_PROCESS_TEXT创建自定义文本选择动作 Android 6.0引入了一个新的浮动文本选择工...

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

markdown转换教程 #

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

Gradle小知识#3:任务的顺序

原文链接 : Gradle tip #3: Tasks ordering 我发现在使用Gradle的过程中遇到的很多问题都跟任务的顺序有关系,不管是已经存在的任务还是我自定义的任务。很显然,如果任务...

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

Android 自动截屏工具

原文链接 : Automating Android Screenshots 随着mac版本AndroidTool的发布,获取android应用截屏变得非常简单。与此同时,感谢开发商!这对于我们开发者来说真是太好了! ...

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

在Android开发中使用RxJava

ReactiveX是专注于异步工作的API,它将异步事件的处理与观察者模式、迭代器模式及函数式编程相结合了起来。实时地处理返回数据是在工程中经常出现的情景,所以使用高效、可...

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

使用Androguard静态分析APK

到目前为止,在之前关于Android逆向工程的介绍中,我们已经知道了APK文件的格式,如何使用使用AAPT,提取应用程序中和Android SDK相关的有用信息,如何将DEX字节码转化成更具...

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

Kotlin for Android (III)/ 扩展函数与默认值

原文链接 : Kotlin for Android (III): Extension functions and default values 现在你已经了解Kotlin基础与如何配置你的项目,是时候谈论Kotlin能为我们做哪些Java做不到...

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

最多阅读

简化Android的UI开发 1年以前  |  444412次阅读
30分钟搭建一个android的私有Maven仓库 2年以前  |  3320次阅读
Android设计与开发工作流 1年以前  |  3229次阅读
Google Enjarify:可代替dex2jar的dex反编译 2年以前  |  3122次阅读
Android多渠道打包工具:apptools 2年以前  |  2680次阅读
Google Java编程风格规范(中文版) 2年以前  |  2646次阅读
Android UI基本技术点 2年以前  |  2638次阅读
Android Studio 生成so文件 及调用 9月以前  |  2565次阅读
Android权限 - 第一篇 2年以前  |  2520次阅读
Stetho 2年以前  |  2447次阅读
2015 Google IO带来的新 Android 开发工具 2年以前  |  2382次阅读
Android死锁初探 10月以前  |  2376次阅读
听FackBook工程师讲*Custom ViewGroups* 2年以前  |  2294次阅读