实验一 计算器APP实验
一、目的:
1、熟悉Android程序的生命周期;2、掌握Android界面设计和控件使用;3、掌握Android事件处理方法。
二、内容:
设计与实现计算器APP,具有以下功能:1、输入两个操作数,输出运算结果;2、能进行加减乘除运算;3、清空操作数和运算结果;4、输入错误时能回退一个字符。
三、设计与实现
界面设计思路:
主界面
需要一个EditText来显示输入输出。
网格布局使界面更加整齐,加入back,和倒数功能。
感觉太空了,之后又加了一个标题。
有一点不足就是按钮在网格布局里没有自动适应布局,左右不对称,试了很多种方式都不就行,就这样吧。
为了防止用户按的第一个按钮是运算符号,editText里默认显示的是0。同样在点击DEL时,显示0。
后来为了解决效果展示的问题,加入了历史记录
界面代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="简单的计算器"
android:textAlignment="center"
android:textColor="#222"
android:textSize="30sp" />
<EditText
android:id="@+id/edt_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:cursorVisible="false"
android:gravity="right"
android:text="0"
android:textSize="28sp" />
<GridLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:columnCount="4"
android:rowCount="5">
<Button
android:id="@+id/btn_back"
android:text="back"
android:textSize="20sp" />
<Button
android:id="@+id/btn_cx"
android:text="CX"
android:textSize="20sp" />
<Button
android:id="@+id/btn_del"
android:text="del"
android:textSize="20sp" />
<Button
android:id="@+id/btn_add"
android:text="+"
android:textSize="20sp" />
<Button
android:id="@+id/btn_n7"
android:text="7"
android:textSize="20sp" />
<Button
android:id="@+id/btn_n8"
android:text="8"
android:textSize="20sp" />
<Button
android:id="@+id/btn_n9"
android:text="9"
android:textSize="20sp" />
<Button
android:id="@+id/btn_div"
android:text="/"
android:textSize="20sp" />
<Button
android:id="@+id/btn_n4"
android:text="4"
android:textSize="20sp" />
<Button
android:id="@+id/btn_n5"
android:text="5"
android:textSize="20sp" />
<Button
android:id="@+id/btn_n6"
android:text="6"
android:textSize="20sp" />
<Button
android:id="@+id/btn_mul"
android:text="*"
android:textSize="20sp" />
<Button
android:id="@+id/btn_n1"
android:text="1"
android:textSize="20sp" />
<Button
android:id="@+id/btn_n2"
android:text="2"
android:textSize="20sp" />
<Button
android:id="@+id/btn_n3"
android:text="3"
android:textSize="20sp" />
<Button
android:id="@+id/btn_sub"
android:text="—"
android:textSize="20sp" />
<Button
android:id="@+id/btn_poi"
android:text="."
android:textSize="20sp" />
<Button
android:id="@+id/btn_n0"
android:text="0"
android:textSize="20sp" />
<Button
android:id="@+id/btn_dao"
android:text="1/"
android:textSize="20sp" />
<Button
android:id="@+id/btn_cal"
android:text="="
android:textSize="20sp" />
</GridLayout>
<TextView
android:id="@+id/tev_his"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:text="历史记录:"
android:textSize="22sp"/>
</LinearLayout>
逻辑设计思路:由于输入错误时能回退一个字符,光用editText.setText(某个常量)很难实现,需要声明一个String变量numlist用来保存之前已经输入的部分,这样回退一个字符只要用substring操作String就行了,让后配合editText.setText()来显示,如下:
case R.id.btn_n1:
numlist+='1';
editText.setText(numlist);
break;
当按下运算符时,需要保存第一个操作数,所以需要声明一个float类型的num1来保存操作数一,如下:
case R.id.btn_add:
num1=Float.parseFloat(editText.getText().toString());
当按下=号的时候,需要判断之前输入的操作符是什么,所以我声明一个char类型的cal来保存之前的运算符,在按下运算符的时候给cal赋值,当第一次按下+号,然后接着按下-号,cal的值就是-号,用于用户输入错误时可以更改运算符。
case R.id.btn_add:
num1=Float.parseFloat(editText.getText().toString());
cal='+';
numlist="";
break;
为了使代码更清晰,声明float类型的num2来保存运算结果,运算结束后把numlist=””,如果用户在=号之后按下数字,numlist就等于数字,程序正常运行,当用户接着按的是运算符号,在editText显示的是上次的结果,第一个操作数num1就为上次的结果,程序也正常。
case R.id.btn_cal:
//判断是否输入第二个操作数
if(numlist.length()!=0)
{
switch (cal){
case '+':
num2=num1+Float.parseFloat(numlist);
editText.setText(String.valueOf(num2));
break;
case '-':
num2=num1-Float.parseFloat(numlist);
editText.setText(String.valueOf(num2));
break;
case '*':
num2=num1*Float.parseFloat(numlist);
editText.setText(String.valueOf(num2));
break;
case '/':
num2=num1/Float.parseFloat(numlist);
editText.setText(String.valueOf(num2));
break;
}
numlist="";
}
break;
当按下DEL时程序需要恢复到刚开始的状态,只要改一下变量的值就行,设计如下:
case R.id.btn_del:
numlist="";
editText.setText(numlist);
num1=0;
num2=0;
break;
当按下倒数的功能时,相当于一次运算,直接将editText里的内容运算后显示就行。运算后需要把numlist=””。
case R.id.btn_dao:
num1=1/Float.parseFloat(editText.getText().toString());
editText.setText(String.valueOf(num1));
numlist="";
break;
经过测试之后,实现基本的操作已经没有问题。
四、遇到的问题
由于保存用户输入数字的是numlist,所以开始我写的代码是:
case R.id.btn_add:
num1=Float.parseFloat(numlist);
cal='+';
numlist="";
break;
当用户点了两次加号时,第一次点击numlist=””
,第二次点击,num1就会等于空,会出错,这时在editText显示的并没有改变,所以选择editText显示的复制给num1。
当用户输入的数字后一直按撤销(CX),发现程序崩溃了,代码如下。
case R.id.btn_cx:
numlist=numlist.substring(0,numlist.length()-1);
editText.setText(numlist);
}
原因是当numlist=””
时,在执行numlist=numlist.substring(0,numlist.length()-1);
时,numlist
已经为零,不能再撤销。之后更改如下:
case R.id.btn_cx:
//防止一直按撤销或按等于后再按撤销,editText还是显示结果的问题
if(numlist.length()==0){
editText.setText(numlist);
break;
}
else{
numlist=numlist.substring(0,numlist.length()-1);
editText.setText(numlist);
break;
}
后来又发现了一个bug,就是输入不止一次’.’的时候,会显示很多很多的点,运算会崩溃。后来修改如下:
case R.id.btn_poi:
if (numlist.indexOf('.')>=0)
{
editText.setText(numlist);
break;
}
else
{
numlist+='.';
editText.setText(numlist);
break;
}
鄙人代码
链接:https://pan.baidu.com/s/13b34Nu2h3K4zi93JuV-qFw 密码:zej6
网友评论