在一个偶然(闲着无聊)的过程中,突然非常好奇为什么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从入门到进阶:Vuex状态管理(十)

    Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 在 Vue 之后引入 vuex 会进行自动 ...

  2. 一种递推组合数前缀和的Trick

    记录一下一种推组合数前缀和的方法 Trick 设\(\sum_{i = 0}^m C_n^i = S(n, m)\) \(S\)是可以递推的 \(S(n, m + 1) = S(n, m) + C_{ ...

  3. 从.Net到Java学习第八篇——SpringBoot实现session共享和国际化

    从.Net到Java学习系列目录 SpringBoot Session共享 修改pom.xml添加依赖 <!--spring session--> <dependency> & ...

  4. Android 性能优化之工具和优化点总结

    Android性能优化学习 最近公司主抓性能优化工作,借此春风也学习到了许多Android性能优化方面的知识.由于组内队友的给力,优化的成果也是比较喜人.同时也学习和实践了不少知识,特此记录. 1.性 ...

  5. 使用Ajax轮询模拟简单的站内信箱(消息管理)功能

    前一段时间项目需要写一个类似于站内信箱的消息管理的功能,由于对前端不是很熟悉,刚开始不知道怎么做,后来看了网上的方案,现模拟一个非常简单的消息管理. 我们首先看一下最终效果的样式,就是非常简单的一个样 ...

  6. Swift UIFont

    设置字体 titleLabel.font = UIFont.systemFont(ofSize: 17.0, weight: .heavy)

  7. 歌曲的BPM (Beat Per Minute)--每分钟节拍数

    因为老爸喜欢跳舞,总让我帮他整理舞曲,一会儿要慢三,一会儿要慢四,一会儿又要快四....我真的分不清啊 我想啊,慢三,慢四这些应该是歌曲的节拍吧(后来得知专业术语叫BPM),于是就在网上搜看看能不能通 ...

  8. Docker之进入容器(三)

    1.简介 经过前面两篇博客的扫盲,大家多多少少对docker有了一个基本的了解,也接触了docker的常用命令.在这篇博客中,我将介绍进入docker容器的几种方式. 2.进入docker中的几种方式 ...

  9. 我的第一个python web开发框架(26)——定制ORM(二)

    弄完底层数据库操作模块后,接下来要做的是ORM的正式设计.在开始之前,我们需要思考一下怎么来设计一个ORM呢?这个类它能帮助我们处理什么样的问题?需要有哪些功能模块?怎么做到针对不同的数据库与表单进行 ...

  10. c#语法学习

    自动属性.隐试类型.命名参数和自动初始化器. note:这里说的这些,是语法糖.按照一定的格式写,部分代码编译器帮我们实现了, 1.自动属性:自动属性是非常有用的语法糖,帮我我们做了两件事:1.自动帮 ...