编写一个简单计算器APP,界面按书上例2-9设计,实现其具体功能:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <GridLayout xmlns:android="http://schemas.android.com/apk/res/android" //通过网格布局设置界面 xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:rowCount="6" //界面设置为6行4列 android:columnCount="4" tools:context=".MainActivity"> <TextView //运算与结果框,默认为0 android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_columnSpan="4" android:layout_marginLeft="4px" android:layout_gravity="left" android:text="0" android:textSize="50dip" android:id="@+id/sum" /> <Button //清空按钮 android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/delete" android:layout_columnSpan="4" android:text="delete" android:textSize="26sp"/> <Button android:id="@+id/btn1" //以下为计算器的基本按键,不再赘述 android:text="+" android:textSize="30sp"/> <Button android:id="@+id/btn2" android:text="1" android:textSize="30sp"/> <Button android:id="@+id/btn3" android:text="2" android:textSize="30sp"/> <Button android:id="@+id/btn4" android:text="3" android:textSize="30sp"/> <Button android:id="@+id/btn5" android:text="-" android:textSize="30sp"/> <Button android:id="@+id/btn6" android:text="4" android:textSize="30sp"/> <Button android:id="@+id/btn7" android:text="5" android:textSize="30sp"/> <Button android:id="@+id/btn8" android:text="6" android:textSize="30sp"/> <Button android:id="@+id/btn9" android:text="*" android:textSize="30sp"/> <Button android:id="@+id/btn10" android:text="7" android:textSize="30sp"/> <Button android:id="@+id/btn11" android:text="8" android:textSize="30sp"/> <Button android:id="@+id/btn12" android:text="9" android:textSize="30sp"/> <Button android:id="@+id/btn13" android:text="/" android:textSize="30sp"/> <Button android:id="@+id/btn14" android:text="." android:textSize="30sp"/> <Button android:id="@+id/btn15" android:text="0" android:textSize="30sp"/> <Button android:id="@+id/btn16" android:text="=" android:textSize="30sp"/> </GridLayout>
MainActivity.java
package com.example.calculator; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { public Button btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btn10, btn11, btn12, btn13, btn14, btn15, btn16, delete; //声明各个按键 public TextView txt; //声明结果框 public String str = ""; //声明一个字符串,用于在结果框中显示 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); txt = (TextView) findViewById(R.id.sum); //各个按键与xml中的按钮建立连接 btn1 = (Button) findViewById(R.id.btn1); btn2 = (Button) findViewById(R.id.btn2); btn3 = (Button) findViewById(R.id.btn3); btn4 = (Button) findViewById(R.id.btn4); btn5 = (Button) findViewById(R.id.btn5); btn6 = (Button) findViewById(R.id.btn6); btn7 = (Button) findViewById(R.id.btn7); btn8 = (Button) findViewById(R.id.btn8); btn9 = (Button) findViewById(R.id.btn9); btn10 = (Button) findViewById(R.id.btn10); btn11 = (Button) findViewById(R.id.btn11); btn12 = (Button) findViewById(R.id.btn12); btn13 = (Button) findViewById(R.id.btn13); btn14 = (Button) findViewById(R.id.btn14); btn15 = (Button) findViewById(R.id.btn15); btn16 = (Button) findViewById(R.id.btn16); delete = (Button) findViewById(R.id.delete); btn1.setOnClickListener(new click()); //建立触发器 btn2.setOnClickListener(new click()); btn3.setOnClickListener(new click()); btn4.setOnClickListener(new click()); btn5.setOnClickListener(new click()); btn6.setOnClickListener(new click()); btn7.setOnClickListener(new click()); btn8.setOnClickListener(new click()); btn9.setOnClickListener(new click()); btn10.setOnClickListener(new click()); btn11.setOnClickListener(new click()); btn12.setOnClickListener(new click()); btn13.setOnClickListener(new click()); btn14.setOnClickListener(new click()); btn15.setOnClickListener(new click()); btn16.setOnClickListener(new click()); delete.setOnClickListener(new click()); } class click implements OnClickListener { //创建触发事件 public void onClick(View v) { double a,b,c; //声明Double abc用于字符串转化为数字和计算 String [] arr; //用于承载spilt函数分解的字符串数组 switch (v.getId()) { //分别按下的按钮 case R.id.btn1: txt.setText(str=str+"+" ); //用户按下按钮后,结果框内的字符串加上加号,下面的也类似 break; case R.id.btn2: txt.setText(str=str+"1" ); break; case R.id.btn3: txt.setText(str=str+"2"); break; case R.id.btn4: txt.setText(str=str+"3"); break; case R.id.btn5: txt.setText(str=str+"-"); break; case R.id.btn6: txt.setText(str=str+"4"); break; case R.id.btn7: txt.setText(str=str+"5"); break; case R.id.btn8: txt.setText(str=str+"6"); break; case R.id.btn9: txt.setText(str=str+"*"); break; case R.id.btn10: txt.setText(str=str+"7"); break; case R.id.btn11: txt.setText(str=str+"8"); break; case R.id.btn12: txt.setText(str=str+"9"); break; case R.id.btn13: txt.setText(str=str+"/"); break; case R.id.btn14: txt.setText(str=str+"."); break; case R.id.btn15: txt.setText(str=str+"0"); break; case R.id.btn16: //等号对应的事件,利用contains函数分别运算的类型 if(str.contains("+")) {arr=str.split("\\+"); //利用spilt方法将两个运算的数字提取出来,转化为数字 a=Double.parseDouble(arr[0]); b=Double.parseDouble(arr[1]);c=a+b; //数字运算 txt.setText(String.valueOf(c));} //数字转化为字符串,输出结果 if(str.contains("-")) {arr=str.split("-"); a=Double.parseDouble(arr[0]); b=Double.parseDouble(arr[1]);c=a-b; txt.setText(String.valueOf(c));} if(str.contains("*")) {arr=str.split("\\*"); a=Double.parseDouble(arr[0]); b=Double.parseDouble(arr[1]);c=a*b; txt.setText(String.valueOf(c));} if(str.contains("/")) {arr=str.split("/"); a=Double.parseDouble(arr[0]); b=Double.parseDouble(arr[1]);c=a/b; txt.setText(String.valueOf(c));} break; case R.id.delete: //删除键对应的事件,将结果框归空,字符串归空 {txt.setText(""); str="";} break; } } } }
结果图:
日志:
在按照课本例题设置计算器界面后,发现删除键过长,普通按键太小而不美观,因此更改了按键的大小,使其更加整齐、并且更改了按键的顺序,让他更好操作。
在Activity的实现上,初步想法是通过按键输入相应的数字,运算符号,再将算式通过结果框输出,然后再将字符串中的数字剥离,进行运算。然而,在实现中,为了减少click方法的创造,多个按键使用同一个触发方法。这导致方法里必须分别按的是哪一个按键,这时候逐个逐个用if语句来判断是不现实的,因此用了switch语句实现该功能。实现了字符串的输出,又该面临如何将数字剥离出来和判别运算方式的问题。一开始,为了实现多项式的运算,我特地翻看了正则表达式,苦恼如何建立运算规则。后来发现多项式运算还是由二项式相加的来,于是简化了规则。每次只进行二项式运算,虽然简单,但也实现了功能。至于剥离和判别运算方式则用spilt方法和if方法实现。