引言
这是移动应用开发入门课程的两个小项目,作为安卓开发入门是合适的。然而该老师在检查程序时居然发问“为什么要从零开始敲代码而不是找别人的成品修改”,看功能演示而不管代码实现(虽然他自己也不会Java)。我不明白一个入门课程为什么要追求功能的华丽,而对基础不管不顾。
技术领域大多数牛人靠自学成才,但不能否认的是自学中踩坑与探索的过程非常消耗时间,合适的引导能让人的效率大大提高。
计算器
文件结构
文件结构作为Android而不是Project进行解析后如图很清晰:第一个(也就是main而非android或test路径下)的/java/com.example.calc/
中为后端处理逻辑的Java类。/res/layout/activity_main.xml
是主要的样式文件,资源文件可以放到/drawable
、/values
中进行引用。
UI开发
Android布局主要有:
- RelativeLayout 相对布局(默认)
- LinearLayout 线性布局:
<LinearLayout></LinearLayout>
控件垂直和水平排列,父控件layout_width="match_parent"
后按权重获得控件占比() - FrameLayout 帧布局:按顺序重叠摆放
- TableLayout 表格布局:界面划分为多个单元格
- GridLayout 网格布局,4.0后引入,比表格布局更加好用
- AbsoluteLayout 绝对布局:指定xy坐标表示位置,由于屏幕尺寸和分辨率的不同非常低效,基本淘汰。
在这里我在线性布局中嵌套了网格布局,属性看这个图就一目了然(图源菜鸟教程):
GridLayout
的属性是这样的:
<GridLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#191919"
android:columnCount="4"
android:rowCount="5">
结合按钮“零”的属性来解释:
<Button
android:id="@+id/btn_0"
android:layout_width="0dp"
android:layout_rowWeight="1"
android:layout_columnSpan="2"
android:layout_columnWeight="1"
android:background="@drawable/frame"
android:text="零"
android:textColor="#FFFFFF"
android:textSize="30sp" />
网格被设置成了五行(row)四列(column),button0占一行、横跨两列,layout_width
设为0,背景资源从drawable
中调用添加1dp边框后的版本。
后端实现
创建MainActivity
继承自AppCompatActivity
,并重写了OnCreate()
方法,初始化生命周期:
initViews()
初始化按键布局,initButtons
使用HashMap
建立了一个键值映射:
退格和等号的处理,这里的异常处理相当于利用了Java的异常,简洁有效:
运算逻辑处理写在DoCalc中,建立了一个伪的“元组”存储运算表达式,判断运算符or数字并进行强制类型转换,相比运算栈要简单但是只能支持双目运算:
BigBang这个类名取自 Smartisan OS 中的大爆炸功能,有些异曲同工之妙。之后就是进行拼接和计算操作,并处理除以零的异常,不再赘述。
记事助手
待开发