在一个偶然(闲着无聊)的过程中,突然非常好奇为什么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. Echarts地图使用经验-地图变形和添加数据

    关于echart2,echart3地图的使用一点人生经验: 1.echart3,echart2加载地图变形修复. 最近在使用echart2使用过程中,发现加载海南地图会产生变形.如下图,海南地图产生了 ...

  2. Gunicorn与uWSGI

    Gunicorn与uWSGI perfork perfork是一种服务端编程模型, Nginx, Gunicorn, uWSGI都是这种模型的实现, 简单的说perfok就是master进程启动注册一 ...

  3. iOS-----------关于组件化

      打一个比较形象的比喻,把APP比作我们的人体,把胳膊.大腿.心.肝.肺这些人体器官比作组件,各个器官分别负责他们各自的功能,但是他们之间也有主次之分,试想我们的胳膊.大腿等是不能独立完成某个任务的 ...

  4. textarea 输入长度限制

    <textarea " placeholder="请输入详细地址(100字以内)"></textarea>

  5. window下 mongodb快速安装

    下载地址 https://www.mongodb.org/dl/win32/x86_64-2008plus-ssl 建立文件夹和文件 #数据库路径 dbpath=G:\mongodb3.4.12\da ...

  6. c/c++ 重载运算符 类型转换运算符

    重载运算符 类型转换运算符 问题:能不能把一个类型A的对象a,转换成另一个类型B的对象b呢?? 是可以的.这就必须要用类型A的类型转换运算符(conversion operator) 下面的opera ...

  7. LeetCode算法题-Shortest Unsorted Continuous Subarray(Java实现)

    这是悦乐书的第267次更新,第281篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第134题(顺位题号是581).给定一个整数数组,找到一个连续的子数组,按升序对该子数组 ...

  8. formatter的使用

    1.目的 如图所示,实现行编辑栏中的编辑删除,以及在时间建议中显示上中下旬 可参考easyui官方文档中所写的关于datagrid列属性:http://www.jeasyui.net/plugins/ ...

  9. 比较两个slice、struct或者map是否相等

    我们可以直接使用reflect.DeepEqual来比较两个slice.struct或者map是否相等 package main import ( "fmt" "refl ...

  10. CSS--字体|垂直居中|background

    一,字体的设置 二,垂直居中 2.1,单行文本垂直居中 2.2,多行文本垂直居中 2.3,绝对定位元素垂直居中 三.颜色的表示法 四.background ---------------------- ...