安卓--Android Studio--简易计算器
- 结果截图
- 关键代码讲解
- 完整代码
本人是一名在校学生,由于上个学期的课程内容包括移动开发,其中的实验也算是大部分是自己完成的,所以算是写博客记录一下吧。
第一次写,有啥问题及时交流哈,不喜勿喷,谢谢啦。
结果截图

关键代码讲解
1.UI设计:
利用EditText、Button控件(控件不唯一,个人喜好);
布局可以采用相对布局,每个小控件的间距自己设即可;
(以下是部分UI代码)
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_gravity="center"android:orientation="horizontal"android:columnCount="4"android:rowCount="7"android:layout_marginBottom="8dp">
<EditTextandroid:id="@+id/text"android:layout_height="200dp"android:layout_columnSpan="4"android:layout_gravity="fill"android:layout_marginLeft="5dp"android:layout_marginRight="5dp"android:layout_marginTop="8dp"android:layout_marginBottom="20dp"android:editable="false"android:gravity="bottom|right"android:inputType="numberDecimal"android:text="0"android:textSize="55sp"android:background="@null"/><Buttonandroid:id="@+id/btn_clear"android:text="AC"android:textSize="30sp"
/>
2.部分java代码:
(1)在界面中使用的控件的定义和注册;
(2)控件的点击事件;
(3)计算器本身的计算功能运用的相关数学函数直接引用相关库函数即可;
(4)注意传参问题。
Button btn_clear;btn_clear=(Button)findViewById(R.id.btn_clear);
public void onClick(View v) {String str = text.getText().toString();switch (v.getId()) {case R.id.btn_0:if(str.equals("0")){str="0";}else{if (str.charAt(str.length()-1)=='÷'){Toast.makeText(MainActivity.this,"除数不能为0",Toast.LENGTH_SHORT).show();}elsestr+="0";}text.setText(str);break;
完整代码
(ps:这个计算器比较简单,一共只有两个代码文件java和xml)
1.MainActivity.java
package com.example.admin.calculator;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;import java.util.ArrayList;import java.util.List;import java.util.StringTokenizer;public class MainActivity extends AppCompatActivity implements View.OnClickListener {Button btn_clear;Button btn_del;Button btn_percent;Button btn_div;Button btn_root;Button btn_tan;Button btn_cos;Button btn_sin;Button btn_7;Button btn_8;Button btn_9;Button btn_mul;Button btn_4;Button btn_5;Button btn_6;Button btn_sub;Button btn_1;Button btn_2;Button btn_3;Button btn_add;Button btn_0;Button btn_p;Button btn_equ;EditText text;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn_clear=(Button)findViewById(R.id.btn_clear);btn_clear.setOnClickListener(this);btn_del=(Button)findViewById(R.id.btn_del);btn_del.setOnClickListener(this);btn_percent=(Button)findViewById(R.id.btn_percent);btn_percent.setOnClickListener(this);btn_div=(Button)findViewById(R.id.btn_div);btn_div.setOnClickListener(this);btn_root=(Button)findViewById(R.id.btn_root);btn_root.setOnClickListener(this);btn_tan =(Button)findViewById(R.id.btn_tan);btn_tan.setOnClickListener(this);btn_cos=(Button)findViewById(R.id.btn_cos);btn_cos.setOnClickListener(this);btn_sin=(Button)findViewById(R.id.btn_sin);btn_sin.setOnClickListener(this);btn_7=(Button)findViewById(R.id.btn_7);btn_7.setOnClickListener(this);btn_8=(Button)findViewById(R.id.btn_8);btn_8.setOnClickListener(this);btn_9=(Button)findViewById(R.id.btn_9);btn_9.setOnClickListener(this);btn_mul=(Button)findViewById(R.id.btn_mul);btn_mul.setOnClickListener(this);btn_4=(Button)findViewById(R.id.btn_4);btn_4.setOnClickListener(this);btn_5=(Button)findViewById(R.id.btn_5);btn_5.setOnClickListener(this);btn_6=(Button)findViewById(R.id.btn_6);btn_6.setOnClickListener(this);btn_sub=(Button)findViewById(R.id.btn_sub);btn_sub.setOnClickListener(this);btn_1=(Button)findViewById(R.id.btn_1);btn_1.setOnClickListener(this);btn_2=(Button)findViewById(R.id.btn_2);btn_2.setOnClickListener(this);btn_3=(Button)findViewById(R.id.btn_3);btn_3.setOnClickListener(this);btn_add=(Button)findViewById(R.id.btn_add);btn_add.setOnClickListener(this);btn_0=(Button)findViewById(R.id.btn_0);btn_0.setOnClickListener(this);btn_p=(Button)findViewById(R.id.btn_p);btn_p.setOnClickListener(this);btn_equ=(Button)findViewById(R.id.btn_equ);btn_equ.setOnClickListener(this);text=(EditText) findViewById(R.id.text);text.setOnClickListener(this);}public void onClick(View v) {String str = text.getText().toString();switch (v.getId()) {case R.id.btn_0:if(str.equals("0")){str="0";}else{if (str.charAt(str.length()-1)=='÷'){Toast.makeText(MainActivity.this,"除数不能为0",Toast.LENGTH_SHORT).show();}elsestr+="0";}text.setText(str);break;case R.id.btn_1:if(str.equals("0")){str="1";}else{str+="1";}text.setText(str);break;case R.id.btn_2:if(str.equals("0")){str="2";}else{str+="2";}text.setText(str);break;case R.id.btn_3:if(str.equals("0")){str="3";}else{str+="3";}text.setText(str);break;case R.id.btn_4:if(str.equals("0")){str="4";}else{str+="4";}text.setText(str);break;case R.id.btn_5:if(str.equals("0")){str="5";}else{str+="5";}text.setText(str);break;case R.id.btn_6:if(str.equals("0")){str="6";}else{str+="6";}text.setText(str);break;case R.id.btn_7:if(str.equals("0")){str="7";}else{str+="7";}text.setText(str);break;case R.id.btn_8:if(str.equals("0")){str="8";}else{str+="8";}text.setText(str);break;case R.id.btn_9:if(str.equals("0")){str="9";}else{str+="9";}text.setText(str);break;case R.id.btn_clear:str="0";text.setText(str);break;case R.id.btn_del:if(str.length()==1){str="0";text.setText(str);}else{text.setText(str.substring(0,str.length()-1));;}break;case R.id.btn_add:if (str.charAt(str.length()-1)=='+'||str.charAt(str.length()-1)=='-'||str.charAt(str.length()-1)=='x'||str.charAt(str.length()-1)=='÷'||str.charAt(str.length()-1)=='.') {Toast.makeText(MainActivity.this,"运算式书写不合法!",Toast.LENGTH_LONG).show();//str="0";}else {str += "+";}text.setText(str);break;case R.id.btn_sub:if (str.charAt(str.length()-1)=='+'||str.charAt(str.length()-1)=='-'||str.charAt(str.length()-1)=='x'||str.charAt(str.length()-1)=='÷'||str.charAt(str.length()-1)=='.') {Toast.makeText(MainActivity.this, "运算式书写不合法!", Toast.LENGTH_LONG).show();}elsestr+="-";text.setText(str);break;case R.id.btn_mul:if (str.charAt(str.length()-1)=='+'||str.charAt(str.length()-1)=='-'||str.charAt(str.length()-1)=='x'||str.charAt(str.length()-1)=='÷'||str.charAt(str.length()-1)=='.') {Toast.makeText(MainActivity.this, "运算式书写不合法!", Toast.LENGTH_LONG).show();}elsestr+="x";text.setText(str);break;case R.id.btn_div:if (str.charAt(str.length()-1)=='+'||str.charAt(str.length()-1)=='-'||str.charAt(str.length()-1)=='x'||str.charAt(str.length()-1)=='÷'||str.charAt(str.length()-1)=='.') {Toast.makeText(MainActivity.this, "运算式书写不合法!", Toast.LENGTH_LONG).show();}elsestr+="÷";text.setText(str);break;case R.id.btn_percent:if (str.charAt(str.length()-1)=='+'||str.charAt(str.length()-1)=='-'||str.charAt(str.length()-1)=='x'||str.charAt(str.length()-1)=='÷'||str.charAt(str.length()-1)=='.') {Toast.makeText(MainActivity.this, "运算式书写不合法!", Toast.LENGTH_LONG).show();}else {// char num=str.charAt(str.length()-1);/* 得到表达式中最后一个数字 */Double d = Double.valueOf(str).doubleValue(); //将得到的数字转为double型d = d / 100;//将数字转为小数形式// str = Double.toString(d);//将小数转为Sting型//str=str+str1;String rs=String.format("%.6f",d);//规避极小误差rs=rs.replaceAll("0+?$","");//去掉多余的0rs=rs.replaceAll("[.]$","");//如最后一位是.,则去掉//str=Double.toString(getResult());str=rs;text.setText(str);}break;case R.id.btn_root:if (str.charAt(str.length()-1)=='+'||str.charAt(str.length()-1)=='-'||str.charAt(str.length()-1)=='x'||str.charAt(str.length()-1)=='÷'||str.charAt(str.length()-1)=='.') {Toast.makeText(MainActivity.this, "运算式书写不合法!", Toast.LENGTH_LONG).show();}else {// char num=str.charAt(str.length()-1);/* 得到表达式中最后一个数字 */Double d = Double.valueOf(str).doubleValue(); //将得到的数字转为double型d = Math.sqrt(d);//计算开平方结果String rs=String.format("%.6f",d);//规避极小误差rs=rs.replaceAll("0+?$","");//去掉多余的0rs=rs.replaceAll("[.]$","");//如最后一位是.,则去掉//str = Double.toString(d);//将小数转为Sting型str=rs;//str=str+str1;text.setText(str);}break;case R.id.btn_tan:if (str.charAt(str.length()-1)=='+'||str.charAt(str.length()-1)=='-'||str.charAt(str.length()-1)=='x'||str.charAt(str.length()-1)=='÷'||str.charAt(str.length()-1)=='.') {Toast.makeText(MainActivity.this, "运算式书写不合法!", Toast.LENGTH_LONG).show();}else {// char num=str.charAt(str.length()-1);/* 得到表达式中最后一个数字 */Double d = Double.valueOf(str).doubleValue(); //将得到的数字转为double型// d = Math.tan(Math.toRadians(20));if (d!=0 && d%90==0){Toast.makeText(MainActivity.this,"输入数据不合法",Toast.LENGTH_SHORT).show();}else {d = Math.tan(d*Math.PI /180);String rs=String.format("%.6f",d);//规避极小误差rs=rs.replaceAll("0+?$","");//去掉多余的0rs=rs.replaceAll("[.]$","");//如最后一位是.,则去掉//str = Double.toString(d);//将小数转为Sting型str=rs;//str=str+str1;text.setText(str);}}break;case R.id.btn_cos:if (str.charAt(str.length()-1)=='+'||str.charAt(str.length()-1)=='-'||str.charAt(str.length()-1)=='x'||str.charAt(str.length()-1)=='÷'||str.charAt(str.length()-1)=='.') {Toast.makeText(MainActivity.this, "运算式书写不合法!", Toast.LENGTH_LONG).show();}else {// char num=str.charAt(str.length()-1);/* 得到表达式中最后一个数字 */Double d = Double.valueOf(str).doubleValue(); //将得到的数字转为double型// d = Math.cos(Math.toRadians(30));d = Math.cos(d*Math.PI /180);String rs=String.format("%.6f",d);//规避极小误差rs=rs.replaceAll("0+?$","");//去掉多余的0rs=rs.replaceAll("[.]$","");//如最后一位是.,则去掉//str = Double.toString(d);//将小数转为Sting型str=rs;//str=str+str1;text.setText(str);}break;case R.id.btn_sin:if (str.charAt(str.length()-1)=='+'||str.charAt(str.length()-1)=='-'||str.charAt(str.length()-1)=='x'||str.charAt(str.length()-1)=='÷'||str.charAt(str.length()-1)=='.') {Toast.makeText(MainActivity.this, "运算式书写不合法!", Toast.LENGTH_LONG).show();}else {// char num=str.charAt(str.length()-1);/* 得到表达式中最后一个数字 */Double d = Double.valueOf(str).doubleValue(); //将得到的数字转为double型d = Math.sin(d*Math.PI /180);String rs=String.format("%.6f",d);//规避极小误差rs=rs.replaceAll("0+?$","");//去掉多余的0rs=rs.replaceAll("[.]$","");//如最后一位是.,则去掉//str = Double.toString(d);//将小数转为Sting型str=rs;//str=str+str1;text.setText(str);}break;case R.id.btn_equ:if (str.charAt(str.length()-1)=='+'||str.charAt(str.length()-1)=='-'||str.charAt(str.length()-1)=='x'||str.charAt(str.length()-1)=='÷'||str.charAt(str.length()-1)=='.') {Toast.makeText(MainActivity.this,"运算式书写不合法!",Toast.LENGTH_LONG).show();//str="0";}else{String rs=String.format("%.6f",getResult());//规避极小误差rs=rs.replaceAll("0+?$","");//去掉多余的0rs=rs.replaceAll("[.]$","");//如最后一位是.,则去掉//str=Double.toString(getResult());str=rs;}text.setText(str);break;case R.id.btn_p:if (str.charAt(str.length()-1)=='+'||str.charAt(str.length()-1)=='-'||str.charAt(str.length()-1)=='x'||str.charAt(str.length()-1)=='÷') {Toast.makeText(MainActivity.this, "运算式书写不合法!", Toast.LENGTH_LONG).show();}else if (str.contains(".")){Toast.makeText(MainActivity.this,"运算式书写不合法",Toast.LENGTH_SHORT).show();}elsestr+=".";text.setText(str);break;}}//计算运算表达式的结果://定义两个表,分别存放数字和运算符,先对运算符进行判断,然后取其左右两个数字,进行相关运算,最后返回结果public Double getResult(){String exp=text.getText().toString();//得到运算表达式List<Double> numbers=splitNumfromExp(exp);//分离数字List<Character> ops= splitOpfromExp(exp);//分离运算符//先算乘除for (int i=0;i<ops.size();i++){///判断运算符是否为乘除char op=ops.get(i);if (op=='x'||op=='÷'){ops.remove(i);//将符号取出,后面的符号往前顺序移动double d1=numbers.remove(i);//从数字数组中取出运算符左右的两个数字double d2=numbers.remove(i);if (op=='x'){d1*=d2;}else {if (d2== 0) {d1 =0;}else{d1/=d2;}}numbers.add(i,d1);//把运算结果放入数字数组中i的位置,原来位置的数以及后面的顺序后移i--;}}//后算加减while (!ops.isEmpty()){char op=ops.remove(0);double d1=numbers.remove(0);double d2=numbers.remove(0);if(op=='+'){d1+=d2;}else{d1-=d2;}//把结果放入数字数组中0的位置numbers.add(0,d1);}return numbers.get(0);///返回运算结果}//从表达式中分离运算符public List<Character> splitOpfromExp(String exp){exp = text.getText().toString();List<Character> ops=new ArrayList<>();//SringTokenizer是一个分隔字符串的应用类,StringTokenizer st=new StringTokenizer(exp,"0123456789.#");//解析exp字符串,并提供指定的分隔符(此处为数字、小数点、负号)while (st.hasMoreTokens()){//hasMoreTokens():返回是否还有分隔符char c=st.nextElement().toString().trim().charAt(0);///trim():去掉字符串首尾的空格//nextElement():返回从当前位置到下一个分隔符的字符串ops.add(c); //调用list接口的函数add(),将得到的运算符添加到列表尾部}return ops;}//从表达式中分离出数字public List<Double> splitNumfromExp(String exp){exp=text.getText().toString();List<Double> numbers=new ArrayList<>();StringTokenizer st=new StringTokenizer(exp,"+-x÷");while (st.hasMoreTokens()){String numStr=st.nextElement().toString().trim();numbers.add(Double.parseDouble(numStr));}return numbers;}}
2.UI界面
<?xml version="1.0" encoding="utf-8"?><GridLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_gravity="center"android:orientation="horizontal"android:columnCount="4"android:rowCount="7"android:layout_marginBottom="8dp"><EditTextandroid:id="@+id/text"android:layout_height="200dp"android:layout_columnSpan="4"android:layout_gravity="fill"android:layout_marginLeft="5dp"android:layout_marginRight="5dp"android:layout_marginTop="8dp"android:layout_marginBottom="20dp"android:editable="false"android:gravity="bottom|right"android:inputType="numberDecimal"android:text="0"android:textSize="55sp"android:background="@null"/><Buttonandroid:id="@+id/btn_clear"android:text="AC"android:textSize="30sp" /><Buttonandroid:id="@+id/btn_del"android:text="←"android:textSize="30sp" /><Buttonandroid:id="@+id/btn_percent"android:text="%"android:textSize="30sp" /><Buttonandroid:id="@+id/btn_div"android:text="÷"android:textSize="30sp" /><Buttonandroid:id="@+id/btn_root"android:text="√ ̄"android:textSize="30sp" /><Buttonandroid:id="@+id/btn_tan"android:text="tan"android:textSize="30sp" /><Buttonandroid:id="@+id/btn_cos"android:text="cos"android:textSize="30sp" /><Buttonandroid:id="@+id/btn_sin"android:text="sin"android:textSize="30sp" /><Buttonandroid:id="@+id/btn_7"android:text="7"android:textSize="30sp" /><Buttonandroid:id="@+id/btn_8"android:text="8"android:textSize="30sp" /><Buttonandroid:id="@+id/btn_9"android:text="9"android:textSize="30sp" /><Buttonandroid:id="@+id/btn_mul"android:text="x"android:textSize="30sp" /><Buttonandroid:id="@+id/btn_4"android:text="4"android:textSize="30sp" /><Buttonandroid:id="@+id/btn_5"android:text="5"android:textSize="30sp" /><Buttonandroid:id="@+id/btn_6"android:text="6"android:textSize="30sp" /><Buttonandroid:id="@+id/btn_sub"android:text="—"android:textSize="30sp" /><Buttonandroid:id="@+id/btn_1"android:text="1"android:textSize="30sp" /><Buttonandroid:id="@+id/btn_2"android:text="2"android:textSize="30sp" /><Buttonandroid:id="@+id/btn_3"android:text="3"android:textSize="30sp" /><Buttonandroid:id="@+id/btn_add"android:text="+"android:textSize="30sp" /><Buttonandroid:id="@+id/btn_0"android:text="0"android:textSize="30sp" /><Buttonandroid:id="@+id/btn_p"android:text="."android:textSize="30sp" /><Buttonandroid:id="@+id/btn_equ"android:layout_columnSpan="2"android:layout_gravity="fill_horizontal"android:text="="android:textSize="30sp" /></GridLayout>

















