项目背景
拿来练手的小项目,一开始觉得毛毛雨啦~~~真正动起手来却发现有很多细节值得深究,先po上开发环境。
- 操作系统:win10
- JDK:1.8
- SDK:
- 开发工具:Android Studio 2.2
布局
关于计算器的布局向来有多种实现方法,比较主流的是LinearLayout、GridLayout 和 TableLayout。
LinearLayout
LinearLayout是最原始的实现方法,布局效果和层级结构如下:
这里为Button equal设置了较大margin是因为一旦为按钮设置了背景色就会失去按钮原先的圆角,排列会比较拥挤。实现布局的要点有三个:
- 可以通过LinearLayout的层级嵌套实现跨行
- 通过父组件的 android:weightSum 和 子组件的 android:layout_weight 属性实现跨列
- 使用 android:layout_weight 属性时,如果是对竖直方向分割,组件的 android:layout_width 属性值设为0dp ,水平方向同理,这样可以均匀分配屏幕空间以自适应屏幕尺寸,且每一格的大小不受组件自身的大小影响
缺点
代码比较复杂,嵌套太多有时会有性能问题
GridLayout
Gridlayout是Android 4.0之后出现的,通过行和列将空间划分成若干单元格,每个单元格的最小尺寸是其中组件自身的尺寸,且会与同一行/列里最长的单元格自动对齐。这样的特性使其不能很好地适应不同屏幕的分辨率,会出现不能均匀地占满空间或者超出屏幕边界的问题。
在网上看到GridLayout 和 LinearLayout使用的API差不多,然后我就想用LinearLayout的方式来解决屏幕适配问题,即将子控件的宽高设为0dp,然后通过android:layout_columWeight 和 android:layout_rowWeight 属性来分配屏幕空间。效果如下,但是Android 7.0以前的版本并不支持这种写法。
小伙伴们如果有gridlayout优化的解决方案,还请不吝赐教,拜托拜托~~~
TableLayout
TableLayout是继承自LinearLayout的,所以也可以通过android:WeightSum属性和android:layout_weight 属性来解决屏幕适配问题,但与LinearLayout不同的是TableLayout 的子组件不用将宽高设为0dp,因为TableLayout子组件的默认宽高是wrap_content且无法更改,这一点也简化了代码。
缺点:只能用android:layout_span 属性跨列,无法实现跨行
综上,基于实现效果的考虑,最后我选择了LinearLayout来布局
逻辑实现
将输入拼接成字符串
- 定义一个String全局变量 last 来存放输入的字符串,为 0~9 和 clear、delete、point 按钮添加 buildNumber 方法,用来处理输入的拼接;
- clear 是清除键,按下此键后,程序里所有与数据及操作有关的全局变量都应重置为0或“0”
- delete是清除键,String.subString(int start,int