1.界面
2.源代码
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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:rowCount="4"
android:columnCount="6"
android:orientation="vertical"
android:gravity="center_vertical"
tools:context="com.example.tanjy.ex2_9_1.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_columnSpan="4"
android:text="0"
android:textSize="50dip"
android:id="@+id/et_calc" />
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
//第一列
<TableRow>
<Button
android:id="@+id/bt_clear"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="清除"
android:textSize="26sp"
android:background="#0066CC"
android:layout_span="4" />
</TableRow>
//第二行
<TableRow>
<Button
android:id="@+id/bt_num1"
android:textSize="26sp"
android:text="1"/>
<Button
android:id="@+id/bt_num2"
android:textSize="26sp"
android:text="2"/>
<Button
android:id="@+id/bt_num3"
android:textSize="26sp"
android:text="3"/>
<Button
android:id="@+id/bt_plus"
android:textSize="26sp"
android:textColor="#FFFFFF"
android:text="+"/>
</TableRow>
//第三行
<TableRow>
<Button
android:id="@+id/bt_num4"
android:textSize="26sp"
android:text="4"/>
<Button
android:id="@+id/bt_num5"
android:textSize="26sp"
android:text="5"/>
<Button
android:id="@+id/bt_num6"
android:textSize="26sp"
android:text="6"/>
<Button
android:id="@+id/bt_minus"
android:textColor="#FFFFFF"
android:textSize="26sp"
android:text="-"/>
</TableRow>
<TableRow>
<Button
android:id="@+id/bt_num7"
android:textSize="26sp"
android:text="7"/>
<Button
android:id="@+id/bt_num8"
android:textSize="26sp"
android:text="8"/>
<Button
android:id="@+id/bt_num9"
android:textSize="26sp"
android:text="9"/>
<Button
android:id="@+id/bt_mult"
android:textColor="#FFFFFF"
android:textSize="26sp"
android:text="*"/>
</TableRow>
<TableRow>
<Button
android:id="@+id/bt_num0"
android:textSize="26sp"
android:text="0"/>
<Button
android:id="@+id/bt_dot"
android:textSize="26sp"
android:text="."/>
<Button
android:id="@+id/bt_equal"
android:textColor="#FFFFFF"
android:textSize="26sp"
android:text="="/>
<Button
android:id="@+id/bt_div"
android:textColor="#FFFFFF"
android:textSize="26sp"
android:text="/"/>
</TableRow>
</TableLayout>
</GridLayout>
MainActivity.java
package com.example.tanjy.ex2_9_1;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.regex.Pattern;
public class MainActivity extends AppCompatActivity {
private Button bt_num0,bt_num1,bt_num2,bt_num3,bt_num4,bt_num5,bt_num6,bt_num7,bt_num8,bt_num9,bt_clear,bt_div,bt_mult,bt_minus,bt_plus,bt_equal,bt_dot;
private TextView et_calc;
private String progress,currentSymbol; //currentSymbol用来记录当前使用的运算符
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViewAndListener();
}
private void initViewAndListener() {
bt_num0=(Button)findViewById(R.id.bt_num0);
bt_num0.setOnClickListener(new clickNum());
bt_num1=(Button)findViewById(R.id.bt_num1);
bt_num1.setOnClickListener(new clickNum());
bt_num2=(Button)findViewById(R.id.bt_num2);
bt_num2.setOnClickListener(new clickNum());
bt_num3=(Button)findViewById(R.id.bt_num3);
bt_num3.setOnClickListener(new clickNum());
bt_num4=(Button)findViewById(R.id.bt_num4);
bt_num4.setOnClickListener(new clickNum());
bt_num5=(Button)findViewById(R.id.bt_num5);
bt_num5.setOnClickListener(new clickNum());
bt_num6=(Button)findViewById(R.id.bt_num6);
bt_num6.setOnClickListener(new clickNum());
bt_num7=(Button)findViewById(R.id.bt_num7);
bt_num7.setOnClickListener(new clickNum());
bt_num8=(Button)findViewById(R.id.bt_num8);
bt_num8.setOnClickListener(new clickNum());
bt_num9=(Button)findViewById(R.id.bt_num9);
bt_num9.setOnClickListener(new clickNum());
bt_clear=(Button)findViewById(R.id.bt_clear);
bt_clear.setOnClickListener(new clickOther());
bt_div=(Button)findViewById(R.id.bt_div);
bt_div.setOnClickListener(new clickOther());
bt_mult=(Button)findViewById(R.id.bt_mult);
bt_mult.setOnClickListener(new clickOther());
bt_minus=(Button)findViewById(R.id.bt_minus);
bt_minus.setOnClickListener(new clickOther());
bt_plus=(Button)findViewById(R.id.bt_plus);
bt_plus.setOnClickListener(new clickOther());
bt_equal=(Button)findViewById(R.id.bt_equal);
bt_equal.setOnClickListener(new clickOther());
bt_dot=(Button)findViewById(R.id.bt_dot);
bt_dot.setOnClickListener(new clickOther());
et_calc=(TextView)findViewById(R.id.et_calc);
}
//数字按钮监听器
class clickNum implements View.OnClickListener{
public void onClick(View v) {
Button num = (Button) v; //获取用户点击的按钮对象
String clickNum = num.getText().toString(); //获取用户点击的数字
progress = et_calc.getText().toString(); //获取结果的值并赋值给progress
if(v == bt_num0){ //按0
progress = dealRes(progress,clickNum);
}else { //按1-9
progress = dealRes(progress,clickNum);
}
et_calc.setText(progress);
}
}
//功能按钮监听器,可以加“.”的情况
class clickOther implements View.OnClickListener {
public void onClick(View v) {
Button num = (Button) v;
String reg = "^(\\d+)|^(\\d+\\+|-|/|\\*\\d+)|^(\\d+\\.\\d+\\+|-|/|\\*\\d+)";
String symbol = num.getText().toString(); //获取用户点击的符号
progress = et_calc.getText().toString(); //获取结果的值并赋值给progress
//按清除按钮
if (v == bt_clear) {
progress = "0";
currentSymbol = "";
//按等号按钮
} else if (v == bt_equal) {
String[] arr = progress.split("\\+|-|/|\\*");
if (progress.split("\\+|-|/|\\*").length != 1) {
progress = splitStr(progress, currentSymbol);
}
//按“.”按钮
} else if (v == bt_dot) {
//如果不符合可以加“.”的情况,则不变,否则加上“.”
progress = !Pattern.matches(reg, progress) ? progress : dealRes(progress, symbol);
//按加减乘除按钮
} else {
//如果式子中存在“+*/”,进行运算;如果存在“-”且不是首位,进行运算
Boolean a = progress.indexOf('+') != -1 || progress.indexOf('*') != -1 || progress.indexOf('/') != -1;
Boolean b = progress.indexOf('-') != -1;
Boolean c = progress.lastIndexOf('-') != 0;
if (a) {
progress = splitStr(progress, currentSymbol);
currentSymbol = num.getText().toString();
progress = progress + currentSymbol;
} else if (b && c) {
progress = splitStr(progress, currentSymbol);
currentSymbol = num.getText().toString();
progress = progress + currentSymbol;
} else {
currentSymbol = num.getText().toString();
progress = progress + currentSymbol;
}
}
et_calc.setText(progress);
}
}
//分割字符串,进行计算,并返回计算结果
public String splitStr (String str , String calSymbol) {
String []strArray = new String[20];
strArray = str.split("\\+|-|/|\\*"); //使用+-*/对式子进行分割
Double res = 0.0;
switch (calSymbol) { //根据运算符号选取操作
case "+" : {
if (strArray.length > 2) res = (- Double.parseDouble(strArray[1])) + Double.parseDouble(strArray[2]);
else res = Double.parseDouble(strArray[0]) + Double.parseDouble(strArray[1]);
currentSymbol = "";
break;
}
case "-" : {
if (strArray.length > 2) res = (- Double.parseDouble(strArray[1])) - Double.parseDouble(strArray[2]);
else res = str.indexOf('-') == 0 ? Double.parseDouble(str) : Double.parseDouble(strArray[0]) - Double.parseDouble(strArray[1]);
currentSymbol = "";
break;
}
case "*" : {
if (strArray.length > 2) res = (- Double.parseDouble(strArray[1])) * Double.parseDouble(strArray[2]);
else res = Double.parseDouble(strArray[0]) * Double.parseDouble(strArray[1]);
currentSymbol = "";
break;
}
case "/" : {
if (strArray.length > 2) res = (- Double.parseDouble(strArray[1])) / Double.parseDouble(strArray[2]);
else res = Double.parseDouble(strArray[0]) / Double.parseDouble(strArray[1]);
currentSymbol = "";
break;
}
}
return String.valueOf(res);
}
//判读字符串的组成,并返回结果
public String dealRes (String str,String clickSymbol){
String reValue = "";
//如果字符串长度为0,直接返回点击的字符
if (str.length() == 0) {
reValue = clickSymbol;
//如果字符串长度为为1,且等于0,且字符不为“.”,则返回点击的字符
} else if(str.length() == 1 && Integer.parseInt(str) == 0 && clickSymbol != bt_dot.getText().toString()) {
reValue = clickSymbol ;
//其他情况,直接拼接点击的字符字符
} else {
reValue = str + clickSymbol;
}
return reValue;
}
}
3.运行结果
按2*3
再按“=”按钮
说明:本文参考链接:https://blog.csdn.net/qq_40121804/article/details/88607188