在一个偶然(闲着无聊)的过程中,突然非常好奇为什么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. html/css的学习之路(1)

    HTML5简介:HTML5是什么?要回答这个问题,我们需要先了解一下HTML是什么.HTML的英文全称为Hyper Text Markup Language,即超文本标记语言.HTML5是HTML的一 ...

  2. AngularJS处理服务器端返回的JSON数据的格式问题

    用ng的$http服务发起ajax请求,php返回的JSON数据格式要正确! 一开始我的php页面是这样返回数据的: if($result){ $oid = mysqli_insert_id($con ...

  3. H5的语义化标签(PS: 后续继续补充)

    头部信息 <header></header> 区块标签 <figure> <figcaption>123</figcaption> < ...

  4. #WEB安全基础 : HTML/CSS | 0x7HTML5和W3C验证

    标准,标准,什么都有标准 你听说过HTML5吗?这是一个新版本,当然也有新标准 我只准备了一个index.html文件 以下是代码 <!DOCTYPE html> <!--告诉浏览器 ...

  5. 转载: ssh连接上华为云Linux服务器,一会就自动断开

    原文链接:https://www.cnblogs.com/mspeer/p/9907734.html 客户端向服务端发送心跳 依赖 ssh 客户端定时发送心跳,putty.SecureCRT.XShe ...

  6. Mac 系统占用100g的解决办法

    Mac 关于本机-磁盘管理,如果发现系统占用超过80g以上的小伙伴们可以做以下操作只需要以下4个步骤,轻松降到30g以内!!!!!!!(仅适用于安装了Xcode的小伙伴) 打开Finder,comma ...

  7. AOP中使用Aspectj对接口访问权限进行访问控制

    切面编程的应用案例比较多,在统一的日志处理,鉴权过程中都会用的AOP原理,本文主要针对对进口的访问权限进行控制为例,说明 切面编程的使用: 1.使用Aspectj的方式进行切面编程: 2.编码环境,s ...

  8. 微信小程序(五) 利用模板动态加载数据

    利用模板动态加载数据,其实是对上一节静态数据替换成动态数据:

  9. JHipster技术栈定制 - JHipster Registry消息总线配置

    本文说明了如何定制化JHipster-Registry,增加消息总线功能. 实现的效果就是修改配置中心的文件后,通过消息队列主动推送给微服务而无需重启微服务,实现配置内容热加载. 1 整体规划 1.1 ...

  10. macos 安装sublime text 3,如何安装插件

    1. 上面的代码如下: import urllib.request,os,hashlib; h = '2915d1851351e5ee549c20394736b442' + '8bc59f460fa1 ...