2016年9月9日21:52:17
MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button button1;
private Button button2;
private Button button3;
private Button button4;
private Button button5;
private Button button6;
private Button button7;
private Button button8;
private Button button9;
private Button button0;
private Button buttonPoint;
private Button buttonDivide;
private Button buttonMultiply;
private Button buttonClear;
private Button buttonDelete;
private Button buttonPlus;
private Button buttonMinus;
private Button buttonEqual;
private EditText editTextInput;//显示输入内容的显示屏控件
private boolean clear_flag;//清空显示屏内容的标识
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button0= (Button) findViewById(R.id.bt_number0);
button1= (Button) findViewById(R.id.bt_number1);
button2= (Button) findViewById(R.id.bt_number2);
button3= (Button) findViewById(R.id.bt_number3);
button4= (Button) findViewById(R.id.bt_number4);
button5= (Button) findViewById(R.id.bt_number5);
button6= (Button) findViewById(R.id.bt_number6);
button7= (Button) findViewById(R.id.bt_number7);
button8= (Button) findViewById(R.id.bt_number8);
button9= (Button) findViewById(R.id.bt_number9);
buttonPoint= (Button) findViewById(R.id.bt_point);
buttonPlus= (Button) findViewById(R.id.bt_plus);
buttonMinus= (Button) findViewById(R.id.bt_minus);
buttonDivide= (Button) findViewById(R.id.bt_divide);
buttonMultiply= (Button) findViewById(R.id.bt_multiply);
buttonClear= (Button) findViewById(R.id.bt_clear);
buttonDelete= (Button) findViewById(R.id.bt_del);
buttonEqual= (Button) findViewById(R.id.bt_equal);
editTextInput = (EditText) findViewById(R.id.editText);//实例化输入内容的显示屏
/*
给实例化的按钮添加点击事件。
*/
button0.setOnClickListener(this);
button1.setOnClickListener(this);
button2.setOnClickListener(this);
button3.setOnClickListener(this);
button4.setOnClickListener(this);
button5.setOnClickListener(this);
button6.setOnClickListener(this);
button7.setOnClickListener(this);
button8.setOnClickListener(this);
button9.setOnClickListener(this);
buttonPoint.setOnClickListener(this);
buttonPlus.setOnClickListener(this);
buttonMinus.setOnClickListener(this);
buttonMultiply.setOnClickListener(this);
buttonDivide.setOnClickListener(this);
buttonDelete.setOnClickListener(this);
buttonClear.setOnClickListener(this);
buttonEqual.setOnClickListener(this);
}
@Override
public void onClick(View view) {
/*
1>给实例的按钮进行分类,建一个String类型数据存储显示屏的内容。
2>
*/
String str = editTextInput.getText().toString();
Log.d("tag",str);
//getText() ,获取TextView的文本内容。
switch (view.getId()){
case R.id.bt_number0:
case R.id.bt_number1:
case R.id.bt_number2:
case R.id.bt_number3:
case R.id.bt_number4:
case R.id.bt_number5:
case R.id.bt_number6:
case R.id.bt_number7:
case R.id.bt_number8:
case R.id.bt_number9:
case R.id.bt_point:
if(clear_flag){
clear_flag=false;
str="";
// editTextInput.setText("");
Log.d("tag","清空标识符clear_flag为true,清空内容");
}
editTextInput.setText(str+((Button)view).getText());
// ( (Button) )view).getText() ; 获取Button中的text 内容
break;
// 以上的按钮全部为输入类型的不具备功能的显示在显示屏上的按钮。
case R.id.bt_divide:
case R.id.bt_multiply:
case R.id.bt_plus:
case R.id.bt_minus:
if(clear_flag){
clear_flag=false;
str="";
// editTextInput.setText("");
Log.d("tag","清空标识符clear_flag为true,清空内容");
}
editTextInput.setText(str+" "+((Button)view).getText()+" ");
// 为了方便逻辑编写,区别于数字按钮,添加“”空字符串。
break;
//以上按钮为输入类型是具备功能的按钮
case R.id.bt_del:
if(clear_flag){
clear_flag=false;
str="";
// editTextInput.setText("");
Log.d("tag","清空标识符clear_flag为true,清空内容");
}
else if (!Objects.equals(str, "")){
Log.d("tag","del按键被点击并生效,字符串减一");
editTextInput.setText(str.substring(0,str.length()-1));
//判断显示屏中的内容是不是为空,如果不为空,使用字符串类型的 substring(int beginIndex,endIndex-1)方法进行减一字符串.
}
break;
case R.id.bt_clear:
//清楚按钮,直接设置显示屏内容为“”空字符串即可。
clear_flag =false;
editTextInput.setText("");
break;
case R.id.bt_equal:
//单独写一个方法, 来进行运算最后的结果。
getResult();
clear_flag =true;
Log.d("tag","equal按钮被点击了。");
break;
}
}
private void getResult(){
//创建一个exp字符串来读取显示屏中的内容。
String exp = editTextInput.getText().toString();
double result = 0;
Log.d("tag","创建一个exp字符串来读取显示屏中的内容,成功!");
/*
运算逻辑方式:
1、判断显示屏的内容是不是空的,如果是空的,点击了“=”后给它直接返回值。
2、判断显示屏中有没有使用到运算符按钮的特征“”空字符串,如果没有,直接返回值。
3、给显示屏上的字符串进行分类,并存储到String类型的变量中。
4、判断字符串中运算符前后的内容是不是为空,若不为空,则开始进行运算。
4.1、判断显示屏上字符串的运算有没有小数点,以及输出结果是否需要修改为int类型。
5、如果运算符前的内容不为空,而运算符后的内容为空,则返回0并警告。
6、运算符前后的内容都为空,则清空显示屏信息。
7、当运算出结果后, 再次点击按钮,则要在之前清空所有的数据。
*/
if (Objects.equals(exp, "")){
Log.d("tag","1、判断显示屏的内容是不是空的,如果是空的,点击了“=”后给它直接返回值。");
return;
}
if (!exp.contains(" ")) {
// exp.contains()方法,匹配获取字符串中内容的关键字
Log.d("tag","判断显示屏中有没有使用到运算符按钮的特征“”空字符串,如果没有,直接返回值。");
return;
}
String s1 = exp.substring(0,exp.indexOf(" "));// 运算符前面的字符串,substring方法时获取两个索引位置之间的字符串
String op = exp.substring(exp.indexOf(" ")+1,exp.indexOf(" ")+2);//获取运算符内容。
String s2 = exp.substring(exp.indexOf(" ")+3);//获取运算符后面的内容。
Log.d("tag","分别为运算符前字符串、运算符、运算符后字符串:"+s1+": "+op+": "+s2);
//程序崩溃的,数字加小数点加数字的原因。
if (s1.contains(".")s2.contains(".")) {
String pointTest1 = s1.substring(s1.indexOf("."));
String pointTest2 = s2.substring(s1.indexOf("."));
if (s1.contains("..") s2.contains("..") pointTest1.contains(".") pointTest2.contains(".")) {
Log.d("tag", "运算错误,出现多个小数点");
Toast.makeText(MainActivity.this, "你眼瞎了,小数点按多了啊!", Toast.LENGTH_SHORT).show();
return;
}
}
//程序崩溃了,出现多个运算符,溢出逻辑之外。
/*
这个问题,可以考虑下建立一个加减乘除的运算符的类,然后通过对类的特征来区别数字与运算符。
*/
if (s2.contains(" ")){
Log.d("tag","运算错误,出现多个运算符");
Toast.makeText(MainActivity.this, "太复杂了我算不出!", Toast.LENGTH_SHORT).show();
return;
}
// 开始较为合理的运算。
if (!s1.equals("")&&!s2.equals("")){
Log.d("tag","开始对数字进行运算。");
double d1 = Double.parseDouble(s1);
double d2 = Double.parseDouble(s2);
switch (op) {
case "+":
result = d1 + d2;
Log.d("tag", "加法运算成功" + result);
break;
case "-":
result = d1 - d2;
Log.d("tag", "减法运算成功" + result);
break;
case "×":
result = d1 * d2;
Log.d("tag", "乘法运算成功" + result);
break;
case "÷":
//对除法进行判断,被除数不能等于0。
if (d2 == 0) {
result = 0.0;
Log.d("tag", "除法运算失败" + result);
Toast.makeText(MainActivity.this, "被除数不能为零!", Toast.LENGTH_SHORT).show();
} else {
result = d1 / d2;
Log.d("tag", "除法运算成功" + result);
}
break;
}
if (!s1.contains(".")&&!s2.contains(".")){
//判断需要输出整数还是小数。
int r = (int)result;
editTextInput.setText(r+"");
Log.d("tag","输出整数"+result);
}else {
editTextInput.setText(result+"");
Log.d("tag","输出小数"+result);
}
}
else if (!s1.equals("")&&s2.equals("")){
editTextInput.setText(exp);
Toast.makeText(MainActivity.this, "请输入完整的算式!", Toast.LENGTH_SHORT).show();
Log.d("tag","运算符后的字符串为空。"+result);
}
else if (s1.equals("")&&!s2.equals("")){
double d2 = Double.parseDouble(s2);
switch (op) {
case "+":
result = d2;
Log.d("tag", "加法运算成功" + result);
break;
case "-":
result = 0 - d2;
Log.d("tag", "减法运算成功" + result);
break;
case "×":
result = 0;
Log.d("tag", "乘法运算成功" + result);
break;
case "÷":
//对除法进行判断,被除数不能等于0。
if (d2 == 0) {
result = 0.0;
Log.d("tag", "除法运算失败" + result);
Toast.makeText(MainActivity.this, "被除数不能为零!", Toast.LENGTH_SHORT).show();
} else {
result = 0;
Log.d("tag", "除法运算成功" + result);
}
break;
}
}else if (s1.equals("")&&s2.equals("")){
editTextInput.setText("");
}
editTextInput.setText(result+"");
}
}