简易计算器
该项目是基于Android下简单的计算器程序,能够满足基本的运算,并在MUMU模拟器上运行。
实现以下功能:
- +、-、×、÷
- ±、. 、C、<- - - 、%
布局如下所示:
代码如下所示:
样式代码:
为了减少在布局文件中的代码,使用样式可以在布局文件中直接引用
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="text_one">
<item name="android:layout_width">120dp</item>
<item name="android:layout_height">97dp</item>
<item name="android:textSize">30sp</item>
<item name="android:onClick">onClick</item>
<item name="android:textColor">#03A9F4</item>
<item name="android:background">#FFFFFF</item>
</style>
<style name="text_two" parent="text_one">
<item name="android:textColor">#0E0D0D</item>
<item name="android:background">#FFFFFF</item>
</style>
<style name="text_three" parent="text_one">
<item name="android:textColor">#ffff</item>
<item name="android:background">#2196F3</item>
</style>
</resources>
布局代码:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout
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:id="@+id/textView1"
android:layout_width="200dp"
android:layout_height="150dp"
android:layout_marginTop="20dp"
android:textSize="50sp"
android:gravity="right"
android:cursorVisible="false"/> //游标不可见
//显示用户正在输入的内容的文本框
<TextView
android:id="@+id/tv_input"
android:layout_width="200dp"
android:layout_height="150dp"
android:textSize="50sp"
android:gravity="right"
android:enabled="false"
android:textColor="#141414"
android:cursorVisible="false"/>
//使用表格行存放按钮(共有5个表格行)
<TableRow>
<Button
android:id="@+id/btn_clear"
android:text="C"
style="@style/text_one" />
<Button
android:id="@+id/btn_divide"
style="@style/text_one"
android:text="÷" />
<Button
android:id="@+id/btn_multiply"
android:text="×"
style="@style/text_one" />
<Button
android:id="@+id/btn_delete"
//因为<--为非法字符,所以用图片形式显示
android:background="@drawable/dd"
style="@style/text_one" />
</TableRow>
<TableRow>
<Button
android:id="@+id/btn_num7"
android:text="7"
style="@style/text_two" />
<Button
android:id="@+id/btn_num8"
android:text="8"
style="@style/text_two" />
<Button
android:id="@+id/btn_num9"
android:text="9"
style="@style/text_two" />
<Button
android:id="@+id/btn_sub"
android:text="-"
style="@style/text_one" />
</TableRow>
<TableRow>
<Button
android:id="@+id/btn_num4"
android:text="4"
style="@style/text_two" />
<Button
android:id="@+id/btn_num5"
android:text="5"
style="@style/text_two"/>
<Button
android:id="@+id/btn_num6"
android:text="6"
style="@style/text_two"/>
<Button
android:id="@+id/btn_add"
android:text="+"
style="@style/text_one" />
</TableRow>
<TableRow>
<Button
android:id="@+id/btn_num1"
android:text="1"
style="@style/text_two"/>
<Button
android:id="@+id/btn_num2"
android:text="2"
style="@style/text_two"/>
<Button
android:id="@+id/btn_num3"
android:text="3"
style="@style/text_two"/>
<Button
android:id="@+id/btn_percent"
android:text="%"
style="@style/text_one" />
</TableRow>
<TableRow>
<Button
android:id="@+id/btn_signed"
android:text="±"
style="@style/text_two" />
<Button
android:id="@+id/btn_num0"
android:text="0"
style="@style/text_two"/>
<Button
android:id="@+id/btn_point"
android:text="."
style="@style/text_two"/>
<Button
android:id="@+id/btn_equal"
android:text="="
style="@style/text_three"/>
</TableRow>
</TableLayout>
界面交互代码:
package com.example.calculator;
import java.util.*;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
import android.app.Activity;
public class MainActivity extends Activity implements OnClickListener {
private List<Double> value_list = new ArrayList<Double>();// 使用Double泛型存用户输入的数字
private List<Integer> operator_list = new ArrayList<Integer>();// 使用Integer泛型存用户输入的运算符,定义+为0,-为1,×为2,÷为3, %为4
// 状态记录(防止用户多次输入)
private boolean add_flag = false;// +按下
private boolean minus_flag = false;// -按下
private boolean multi_flag = false;// ×按下
private boolean div_flag = false;// ÷按下
private boolean result_flag = false;// =按下
private boolean can_operate_flag = false;// 按下=是否响应
private boolean per_flag = false;//百分号
private static int sign_flag = 0;//正负号(记录按下的次数)
private TextView textView1;
private TextView editText1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//按钮初始化以及设监听器
findViewById(R.id.btn_num0).setOnClickListener(this);
findViewById(R.id.btn_num1).setOnClickListener(this);
findViewById(R.id.btn_num2).setOnClickListener(this);
findViewById(R.id.btn_num3).setOnClickListener(this);
findViewById(R.id.btn_num4).setOnClickListener(this);
findViewById(R.id.btn_num5).setOnClickListener(this);
findViewById(R.id.btn_num6).setOnClickListener(this);
findViewById(R.id.btn_num7).setOnClickListener(this);
findViewById(R.id.btn_num8).setOnClickListener(this);
findViewById(R.id.btn_num9).setOnClickListener(this);
findViewById(R.id.btn_point).setOnClickListener(this);
findViewById(R.id.btn_clear).setOnClickListener(this);
findViewById(R.id.btn_add).setOnClickListener(this);
findViewById(R.id.btn_sub).setOnClickListener(this);
findViewById(R.id.btn_multiply).setOnClickListener(this);
findViewById(R.id.btn_divide).setOnClickListener(this);
findViewById(R.id.btn_equal).setOnClickListener(this);
findViewById(R.id.btn_delete).setOnClickListener(this);
findViewById(R.id.btn_percent).setOnClickListener(this);
findViewById(R.id.btn_signed).setOnClickListener(this);
textView1 = (TextView) findViewById(R.id.textView1);
editText1 = (TextView) findViewById(R.id.tv_input);
}
//触发点击事件,使用switch判断哪个事件被触发
//其中0-9和“ . ”触发的事件调用调用num_down(String num)方法
//+ 、- 、 × 、÷ 、% 调用 = 中自带的方法 operator_list.add(_operator)
//±将两个文本框的内容强转为String类型,replace()对正负进行替换,并使用全局变量对点击次数标识需要运行的语句,在点击第二次的时候使用trim()方法对对空白字符进行清空
//C使用自带的方法clear()直接进行清除
//<--将文本框的内容强转为String类型,substring()对已输入的内容进行截取
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_num0:
num_down("0");
break;
case R.id.btn_num1:
num_down("1");
break;
case R.id.btn_num2:
num_down("2");
break;
case R.id.btn_num3:
num_down("3");
break;
case R.id.btn_num4:
num_down("4");
break;
case R.id.btn_num5:
num_down("5");
break;
case R.id.btn_num6:
num_down("6");
break;
case R.id.btn_num7:
num_down("7");
break;
case R.id.btn_num8:
num_down("8");
break;
case R.id.btn_num9:
num_down("9");
break;
case R.id.btn_point:
num_down(".");
break;
case R.id.btn_add:
if (!add_flag)// 防止用户多次输入一个符号键,符号键只允许输入一次
{
result_flag = false;
value_list.add(Double.parseDouble(editText1.getText()
.toString()));// 将当前已输入的数字放入value_list
operator_list.add(0);
textView1.setText(textView1.getText() + "+");
add_flag = true;
can_operate_flag = false;// 刚刚输入完符号,不能构成一条正常的表达式,如111+,设置为不可运行状态
}
break;
case R.id.btn_sub:
if (!minus_flag) {
result_flag = false;
value_list.add(Double.parseDouble(editText1.getText()
.toString()));
operator_list.add(1);
textView1.setText(textView1.getText() + "-");
minus_flag = true;
can_operate_flag = false;
}
break;
case R.id.btn_multiply:
if (!multi_flag) {
result_flag = false;
value_list.add(Double.parseDouble(editText1.getText()
.toString()));
operator_list.add(2);
textView1.setText("(" + textView1.getText() + ")×");// 给前面的已经输入的东西加个括号。
multi_flag = true;
can_operate_flag = false;
}
break;
case R.id.btn_divide:
if (!div_flag) {
result_flag = false;
value_list.add(Double.parseDouble(editText1.getText()
.toString()));
operator_list.add(3);
textView1.setText("(" + textView1.getText() + ")÷");
div_flag = true;
can_operate_flag = false;
}
break;
case R.id.btn_percent:
if (!per_flag) {
result_flag = false;
value_list.add(Double.parseDouble(editText1.getText().toString()));
operator_list.add(4);
textView1.setText(textView1.getText() + "%");
per_flag = true;
can_operate_flag = true;
}
break;
case R.id.btn_signed:
if (sign_flag == 0) {
textView1.setText("-" + textView1.getText());
editText1.setText("-" + editText1.getText());
String s = (String) textView1.getText();
String s1 = (String) editText1.getText();
if (!s.equals('-')) {
textView1.setText(s.replace(' ', '-'));
textView1.setText(textView1.getText());
}
if (!s1.equals('-')) {
editText1.setText(s1.replace(' ', '-'));
editText1.setText(editText1.getText());
}
sign_flag=1;
} else if (sign_flag == 1) {
String s = (String) textView1.getText();
String s1 = (String) editText1.getText();
if (!s.equals(' ')) {
textView1.setText(s.replace('-', ' '));
textView1.setText(((String) textView1.getText()).trim());
}
if (!s1.equals(' ')) {
editText1.setText(s1.replace('-', ' '));
editText1.setText(((String) editText1.getText()).trim());
}
sign_flag = 0;
}
break;
case R.id.btn_equal:
if (value_list.size() > 0 && operator_list.size() > 0
&& can_operate_flag) {// 需要防止用户没输入数字,或者只输入了一个数,就按=。
value_list.add(Double.parseDouble(editText1.getText()
.toString()));
double total = value_list.get(0);
for (int i = 0; i < operator_list.size(); i++) {
int _operator = operator_list.get(i);// operator运算符重载的关键字,前面加个_来区别
switch (_operator) {
case 0:
total += value_list.get(i + 1);
break;
case 1:
total -= value_list.get(i + 1);
break;
case 2:
total *= value_list.get(i + 1);
break;
case 3:
total /= value_list.get(i + 1);
break;
case 4:
total = value_list.get(i + 1) / 100;
break;
case 5:
total = value_list.get(i + 1) * (-1);
}
}
editText1.setText(total + "");
textView1.setText(total + "");
operator_list.clear();// 算完,就清空累积数字与运算数组
value_list.clear();
result_flag = true;// 表示=按下
}
break;
case R.id.btn_clear:
operator_list.clear();
value_list.clear();
add_flag = false;
minus_flag = false;
multi_flag = false;
div_flag = false;
result_flag = false;
per_flag = false;
can_operate_flag = false;
editText1.setText("");
textView1.setText("");
break;
case R.id.btn_delete:
String str =(String) textView1.getText();
if (!str.equals("") && str!=null){
textView1.setText(str.substring(0,str.length()-1));
}
String str2 =(String) editText1.getText();
if (!str2.equals("") && str2!=null){
editText1.setText(str2.substring(0,str2.length()-1));
}
break;
}
}
// 数字键按下,含0与.
private void num_down(String num) {
if (add_flag || minus_flag || multi_flag || div_flag || result_flag) {
if (result_flag)// 按下等号,刚刚算完一个运算的状态
{
textView1.setText("");
}
editText1.setText("");// 如果用户刚刚输入完一个运算符
add_flag = false;
minus_flag = false;
multi_flag = false;
div_flag = false;
result_flag = false;
per_flag = true;
}
//按下“ . ”并且输入内容的文本框中没有小数点即使用indexOf返回-1小于0,或者没有按下“ . ”才允许继续输入内容
if ((num.equals(".") && editText1.getText().toString().indexOf(".") < 0)
|| !num.equals(".")) {
// 如果用户输入的是小数点.,则要判断当前已输入的数字中是否含有小数点.才允许输入
editText1.setText(editText1.getText() + num);
textView1.setText(textView1.getText() + num);
can_operate_flag = true;
}
}