在一个偶然(闲着无聊)的过程中,突然非常好奇为什么LinearLayout在不指定排列方向为垂直(VERTICAL)时就得是水平方向(HORIZONTAL)排列的。产生这个疑问的时候脑子里蹦出来的第一个回答就是:肯定是LinearLayout在实例化过程中指定了它的默认值为HORIZONTAL。反正这会闲着也是闲着,不墨迹,看源码!!!

在LinearLayout的源码(Android4.4)中找到setOrientation()方法的实现如下图所示。

图1 setOrientation的实现

嗯,够简单粗暴,代码就该这样写!在LinearLayout中关于元素排列方向,就只是用一个int型的变量来表示而已。

图2 表示元素排列方向的变量定义

接下来为了验证自己之前的猜想:在LinearLayout实例化过程中设置了它的默认排列方向为水平方向。于是开始搜索LinearLayout中关于mOrientation变量的赋值操作。

图3 LinearLayout中mOrientation的hits

发现出了在1683行中在setOrientation()方法中有一次赋值操作外,就不再有任何的其它赋值操作了。LinearLayout在实例化过程中并没有去指定元素排列方向为HORIZONTAL啊,那它是如何保证默认值为HORIZONTAL的?等等,mOrientation是int型变量,全局int型变量默认值是0的。我们去看看HORIZONTAL与VERTICAL静态变量的本质是什么。

图4 HORIZONTAL与VERTICAL的定义

果不其然。LinearLayout在实例化过程中根本不需要显示地去指定它的元素排列方向为水平。 在LinearLayout中元素水平排列是它与生俱来的特性。

这个小知识点虽然简单到不能算是知识点。但是我却实实在在地被震撼到了。因为在这里,我见到了一个“优雅的程序设计”活生生的例子。只要我们的程序在编写之初能有一个好的“设计蓝图”确实是能帮我们省却不少工作量的,同时还能提升他人的阅读体验,让阅读者对程序设计者感到佩服。

在我个人接受的关于面向对象编程的传统教育中,都是不太提倡使用整型来做一些常量啊或其它标识类型的定义的,因为它不好管理,也不太直观。在这个地方,如果换成我来写的话,我有可能会将HORIZONTAL与VERTICAL设计成枚举类型来定义。如此一来的话,在LinearLayout实例化过程中可能就不得不要显示地指定mOrientation变量的值为HORIZONTAL了,为此就多了至少一步的工作量了。

个人感觉,知识点这种东西,不应该去给它打上“过时”或是“潮流”的标签。那些被我们打上“过时”的标签的代码设计方式,它只是在当下的环境中,用的比较少或是有更好的替代品而已。你不应该也不能将它“打入冷宫”,只要你记得它,它总是有一天能给你帮上忙的。

Android的LinearLayout中orientation默认值为什么是HORIZONTAL的更多相关文章

  1. 《Entity Framework 6 Recipes》中文翻译系列 (14) -----第三章 查询之查询中设置默认值和存储过程返回多结果集

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-6在查询中设置默认值 问题 你有这样一个用例,当查询返回null值时,给相应属性 ...

  2. yii2中textarea中的默认值设置

    1. view中显示文本域的位置 <?= $form->field($goods_model, 'goods_introduce')->textArea(['class'=>' ...

  3. struts中的常量,action配置中的默认值

    1.struts中Action的开发方式 继承ActionSupport类,这种方法实现的Action可以进行数据校验: 实现Action接口: 不继承任何类,不实现任何接口: 是否继承类或实现接口, ...

  4. asp.net EF model中的默认值设置

    在做数据库规划时,通常会规划一些系统字段,也就是由数据库本身自行指定默认值到这个字段上,创建新的“创建时间(CreateDate)”字段就会常常这样设计. 如果希望能有默认值,且让.net 程序在新增 ...

  5. EF Core中,通过实体类向SQL Server数据库表中插入数据后,实体对象是如何得到数据库表中的默认值的

    我们使用EF Core的实体类向SQL Server数据库表中插入数据后,如果数据库表中有自增列或默认值列,那么EF Core的实体对象也会返回插入到数据库表中的默认值. 下面我们通过例子来展示,EF ...

  6. android 给LinearLayout中添加一定数量的控件,并让着一定数量的控件从右到左移动,每隔若干秒停顿一下,最后一个view链接第一个view,然后继续移动循环往复,形成一个死循环简单动画效果

    主类:IndexAnimationLinearLayout.java package com.yw.sortlistview; import java.util.ArrayList; import j ...

  7. C# 方法中带默认值的参数

    设计一个方法的参数时,可为部分或全部参数分配默认值.然后,调用这些方法的代码可以选择不指定部分实参,接受其默认值.除此之外,调用方法时,还可通过指定参数名称的方式为其传递实参.以下代码演示了可选参数和 ...

  8. react中属性默认值是true?

    看到项目代码中 return ( <MyWebView state="Login" title="登录app" ref="login" ...

  9. mysql5.5中datetime默认值不能为NOW或者CURRENT_TIMESTAMP,用触发器解决

    mysql5.6及以上的版本datatime默认值可以为CURRENT_TIMESTAMP或者NOW 那我们要用的是mysql5.5及以下版本呢? 请看代码 delimiter // DROP TRI ...

随机推荐

  1. 后端开发者的Vue学习之路(五)

    目录 上节内容回顾 使用第三方组件库 如何发起请求 请求错误处理 请求带参 以get的方式带参: 以post的方式带参: 封装处理 请求的配置 axios实例 实现调用自定义函数来发起请求 抽取axi ...

  2. SQL Server中几种遍历方式比较

    SQL遍历解析 在SQL的存储过程,函数中,经常需要使用遍历(遍历table),其中游标.临时表等遍历方法很常用.面对小数据量,这几种遍历方法均可行,但是面临大数据量时,就需要择优选择,不同的遍历方法 ...

  3. WebService访问oracle数据库本地调试

    WebService访问oracle数据库本地调试-一步一个坑 上篇文章提到我们额数据库挂了,重装了数据库,然后呢我需要在本地调试WebService,看看那些数据结构缺失,迁移到新数据库中去.踩坑之 ...

  4. 42.Odoo产品分析 (四) – 工具板块(10) – 问卷(2)

    查看Odoo产品分析系列--目录 接上一篇Odoo产品分析 (四) – 工具板块(10) – 问卷(1) 4 页面 即问卷,点开一项查看:  可以看出,网页就是问卷本身的子目录,其中指明了该目录包括哪 ...

  5. android 开发之 ListView 与Adapter 应用实践

    在开发android中,ListView 的应用显得非常频繁,只要需要显示列表展示的应用,可以说是必不可少,下面是记录开发中应用到ListView与Adapter 使用的实例: ListView 所在 ...

  6. 浅谈SPA

    最近一直在学习关于Vue的一些知识,由于遇到了问题,去网上查找资料,收获颇丰,在此分享. 1. 什么是SPA? 单页Web应用(single page web application, SPA),就是 ...

  7. spring学习总结——高级装配学习一(profile与@Conditional)

    前言: 在上一章装配Bean中,我们看到了一些最为核心的bean装配技术.你可能会发现上一章学到的知识有很大的用处.但是,bean装配所涉及的领域并不仅仅局限于上一章 所学习到的内容.Spring提供 ...

  8. MongoDB 在系统数据库local上无法创建用户的解决方法

    我们知道,MongoDB的Oplog (operations log)记录了用户的最近一段时间的操作(时间长短主要受设置的oplogSize和程序的写入更新量的影响).那么,如果其他部门(例如BI团队 ...

  9. 中科曙光I620-G15服务器登录密码破解

    服务器型号:中科曙光I620-G15服务器 系统:windowsserver2008R2 单位:保密 服务器登录密码忘记了,进不去桌面,后来在我们云修网工程师的指导下,顺利绕过密码登录系统,然后修改系 ...

  10. linux上修改mysql登陆密码

    1. 修改MySQL的登录设置: # vi /etc/my.cnf     2. 在[mysqld]的段中加上一句:skip-grant-tables  例如: [mysqld] port       ...