1.界面设计
整体使用的是线性布局(LinearLayout),输入输入框,按键使用的是网格布局(GridLayout)结果如下:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="计算器"
android:gravity="center"
android:textSize="50sp"
/>
<EditText
android:id="@+id/main_et_result"
android:layout_width="match_parent"
android:layout_height="100dp"
android:hint="请输入数字"
android:paddingBottom="5dp"
android:paddingRight="5dp"
android:background="#FFCCCC"
/>
<GridLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:rowCount="5"
android:columnCount="4"
android:layout_margin="5dp"
>
<Button
android:id="@+id/btndel"
android:layout_width="95dp"
android:layout_height="60dp"
android:text="clear"/>
<Button
android:id="@+id/btn"
android:layout_width="95dp"
android:layout_height="60dp"
android:text="del"/>
<Button
android:id="@+id/btnc"
android:layout_width="95dp"
android:layout_height="60dp"
android:text="/"
/>
<Button
android:id="@+id/btnx"
android:layout_width="95dp"
android:layout_height="60dp"
android:text="*"
android:layout_gravity="fill"
/>
<Button
android:id="@+id/btn7"
android:layout_width="95dp"
android:layout_height="60dp"
android:text="7"
/>
<Button
android:id="@+id/btn8"
android:layout_width="95dp"
android:layout_height="60dp"
android:text="8"
/>
<Button
android:id="@+id/btn9"
android:layout_width="95dp"
android:layout_height="60dp"
android:text="9"
/>
<Button
android:id="@+id/btnj"
android:layout_width="95dp"
android:layout_height="60dp"
android:layout_gravity="fill"
android:text="-"
/>
<Button
android:id="@+id/btn4"
android:layout_width="95dp"
android:layout_height="60dp"
android:text="4"
/>
<Button
android:id="@+id/btn5"
android:layout_width="95dp"
android:layout_height="60dp"
android:text="5"
/>
<Button
android:id="@+id/btn6"
android:layout_width="95dp"
android:layout_height="60dp"
android:text="6"
/>
<Button
android:id="@+id/btn1a"
android:layout_width="95dp"
android:layout_height="60dp"
android:layout_gravity="fill"
android:text="+" />
<Button
android:id="@+id/btn1"
android:layout_width="95dp"
android:layout_height="60dp"
android:text="1"
/>
<Button
android:id="@+id/btn2"
android:layout_width="95dp"
android:layout_height="60dp"
android:text="2"
/>
<Button
android:id="@+id/btn3"
android:layout_width="95dp"
android:layout_height="60dp"
android:text="3"
/>
<Button
android:id="@+id/btnd"
android:layout_width="95dp"
android:layout_height="60dp"
android:layout_gravity="fill"
android:text="."
/>
<Button
android:id="@+id/btn1d"
android:layout_width="95dp"
android:layout_height="60dp"
android:layout_columnSpan="2"
android:layout_gravity="fill"
android:text="="
/>
<Button
android:id="@+id/btn0"
android:layout_width="95dp"
android:layout_height="60dp"
android:layout_columnSpan="2"
android:layout_gravity="fill"
android:text="0" />
<Space />
</GridLayout>
</LinearLayout>
2.逻辑实现
主类中实现view.OnClickListener接口,重写onclick()方法。
onCreate()中用findViewById(R.id.btn1);初始化,并添加点击事件,
main_btn0.setOnClickListener(this);
运算逻辑
当点击“=”时,通过获取输入框内容进行运算
MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
// 结果集
private EditText editText;
//数字1-9
private Button main_btn1;
private Button main_btn2;
private Button main_btn3;
private Button main_btn4;
private Button main_btn5;
private Button main_btn6;
private Button main_btn7;
private Button main_btn8;
private Button main_btn9;
private Button main_btn0;
//运算符
private Button main_btn1a ;// +
private Button main_btnj; // -
private Button main_btnx; // *
private Button main_btnc; // /
private Button main_btnd; //小数点
private Button main_btn1d; //=
//清除
private Button main_btndel;
boolean clear_flag;//清空标识
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//数字1-9
View main_btn1 = findViewById(R.id.btn1);
View main_btn2 = findViewById(R.id.btn2);
View main_btn3= findViewById(R.id.btn3);
View main_btn4 = findViewById(R.id.btn4);
View main_btn5 = findViewById(R.id.btn5);
View main_btn6 = findViewById(R.id.btn6);
View main_btn7 = findViewById(R.id.btn7);
View main_btn8 = findViewById(R.id.btn8);
View main_btn9 = findViewById(R.id.btn9);
View main_btn0 = findViewById(R.id.btn0);
//运算符
View main_btn1a = findViewById(R.id.btn1a);// +
View main_btnj = findViewById(R.id.btnj);// -
View main_btnx = findViewById(R.id.btnx);// *
View main_btnc = findViewById(R.id.btnc); // /
View main_btnd = findViewById(R.id.btnd);//小数点
View main_btn1d = findViewById(R.id.btn1d);//=
View main_btndel = findViewById(R.id.btndel);//清空
editText = (EditText) findViewById(R.id.main_et_result);//结果集
//添加点击事件
main_btn0.setOnClickListener(this);
main_btn1.setOnClickListener(this);
main_btn2.setOnClickListener(this);
main_btn3.setOnClickListener(this);
main_btn4.setOnClickListener(this);
main_btn5.setOnClickListener(this);
main_btn6.setOnClickListener(this);
main_btn7.setOnClickListener(this);
main_btn8.setOnClickListener(this);
main_btn9.setOnClickListener(this);
main_btnd.setOnClickListener(this);
main_btndel.setOnClickListener(this);
main_btn1a.setOnClickListener(this);
main_btnj.setOnClickListener(this);
main_btnx.setOnClickListener(this);
main_btnc.setOnClickListener(this);
main_btn1d.setOnClickListener(this);
}
//读取每个按钮的点击的内容
@Override
public void onClick(View view) {
//获取文本内容
String input = editText.getText().toString();
switch (view.getId()){
case R.id.btn0:
case R.id.btn1:
case R.id.btn2:
case R.id.btn3:
case R.id.btn4:
case R.id.btn5:
case R.id.btn6:
case R.id.btn7:
case R.id.btn8:
case R.id.btn9:
case R.id.btnd:
if(clear_flag){
clear_flag = false;
editText.setText("");//赋值为空
}
editText.setText(input + ((Button)view).getText());//结果集就为本身
break;
case R.id.btn1a:
case R.id.btnj:
case R.id.btnx:
case R.id.btnc:
if(clear_flag){
clear_flag = false;
input = "";
editText.setText("");
}
editText.setText(input + " " + ((Button)view).getText() + " ");
break;
case R.id.btndel:
if(clear_flag){
clear_flag = false;
input = "";
editText.setText("");
}else if(input != null || !input.equals("")) {//如果获取到的内容为空
editText.setText(input.substring(0, input.length() - 1));//结果集为空
}
break;
case R.id.btn1d://运算结果 =
getResult();//调用处理结果集的方法
break;
}
}
//运算结果的方法
private void getResult(){
String exp = editText.getText().toString();//获取文本框的内容
if(exp==null||exp.equals("")){
return;
}
if(!exp.contains(" ")){
return;
}
if(clear_flag){
clear_flag = false;
return;
}
clear_flag = true;
double result = 0;
//进行截取
//运算符前的数字
String s1 = exp.substring(0,exp.indexOf(" "));
//运算符
String op = exp.substring(exp.indexOf(" ")+1,exp.indexOf(" ")+2);
//运算符后的数字
String s2 = exp.substring(exp.indexOf(" ")+3);
if(!s1.equals("")&&!s2.equals("")) {//如果包含小数点的运算
double d1 = Double.parseDouble(s1);//则数字都是double类型
double d2 = Double.parseDouble(s2);
if (op.equals("+")) {//如果是 +
result = d1 + d2;
} else if (op.equals("-")) {
result = d1 - d2;
} else if (op.equals("*")) {
result = d1 * d2;
} else if (op.equals("/")) {
if (d2 == 0) { //如果被除数是0
result = 0; //则结果是0
}
else {//否则执行正常是除法运算
result = d1 / d2;
}
}
if (!s1.contains(".") && !s2.contains(".") && !op.equals("/")) {//如果是整数类型
int r = (int) result; //都是整形
editText.setText(r + "");
} else{
editText.setText(result + "");
}
}else if(!s1.equals("") && s2.equals("")){//如果是只输入运算符前的数
editText.setText(exp);//直接返回当前文本框的内容
}else if(s1.equals("") && !s2.equals("")){//如果是只输入运算符后面的数
double d2 = Double.parseDouble(s2);
//运算符前没有输入数字
if (op.equals("+")) {
result = 0 + d2;
} else if (op.equals("-")) {
result = 0 - d2;
} else if (op.equals("*")) {
result = 0;
} else if (op.equals("/")) {
result = 0;
}
if (!s1.contains(".") && !s2.contains(".")) {
int r = (int) result;
editText.setText(r + "");
} else{
editText.setText(result + "");
}
}else {
editText.setText("");
}
}
}