鄙人新手 整了 快两天 终于搞定了。。
1.首先是MainActivity 中 在Oncreate函数中 注册
2.按+ 或者 - 号 来分成两大字符串 s1 和 s2
再将s2 分为更小的s1 和 s2 直到 s2不包含+ 或者 -号
思路就是这样,没用递归,递归速度太慢,也不擅长用递归。
3.就是找各种Bug 还有装饰
基本达成目标 和自己手机上安卓的自带计算器基本一样。
改正 双击等于 死机
改正 除数可以为0
改正 不能多个运算符
...未知
项目代码如下:
链接: http://pan.baidu.com/s/1c0dj748 密码: hkyx
写法如下package com.example.administrator.myapplication;
import android.app.Activity; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class MainActivity extends Activity implements OnClickListener { private Button bt_0; private Button bt_1; private Button bt_2; private Button bt_3; private Button bt_4; private Button bt_5; private Button bt_6; private Button bt_7; private Button bt_8; private Button bt_9; private Button bt_point; private Button bt_C; private Button bt_DEL; private Button bt_minuse; private Button bt_multipy; private Button bt_plus; private Button bt_divide; private Button bt_dengyu; private EditText input_text; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 注册Button bt_0 = (Button) findViewById(R.id.bt_0); bt_1 = (Button) findViewById(R.id.bt_1); bt_2 = (Button) findViewById(R.id.bt_2); bt_3 = (Button) findViewById(R.id.bt_3); bt_4 = (Button) findViewById(R.id.bt_4); bt_5 = (Button) findViewById(R.id.bt_5); bt_6 = (Button) findViewById(R.id.bt_6); bt_7 = (Button) findViewById(R.id.bt_7); bt_8 = (Button) findViewById(R.id.bt_8); bt_9 = (Button) findViewById(R.id.bt_9); bt_point = (Button) findViewById(R.id.bt_point); bt_C = (Button) findViewById(R.id.bt_clear); bt_DEL = (Button) findViewById(R.id.bt_del); bt_minuse = (Button) findViewById(R.id.bt_minuse); bt_multipy = (Button) findViewById(R.id.bt_multipy); bt_plus = (Button) findViewById(R.id.bt_plus); bt_divide = (Button) findViewById(R.id.bt_divide); bt_dengyu = (Button) findViewById(R.id.bt_dengyu); input_text = (EditText) findViewById(R.id.edit_text1); // 监听事件 bt_0.setOnClickListener(this); bt_1.setOnClickListener(this); bt_2.setOnClickListener(this); bt_3.setOnClickListener(this); bt_4.setOnClickListener(this); bt_5.setOnClickListener(this); bt_6.setOnClickListener(this); bt_7.setOnClickListener(this); bt_8.setOnClickListener(this); bt_9.setOnClickListener(this); bt_point.setOnClickListener(this); bt_C.setOnClickListener(this); bt_DEL.setOnClickListener(this); bt_minuse.setOnClickListener(this); bt_multipy.setOnClickListener(this); bt_plus.setOnClickListener(this); bt_divide.setOnClickListener(this); bt_dengyu.setOnClickListener(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } @Override public void onClick(View v) { String str = input_text.getText().toString(); switch (v.getId()) { case R.id.bt_0: case R.id.bt_1: case R.id.bt_2: case R.id.bt_3: case R.id.bt_4: case R.id.bt_5: case R.id.bt_6: case R.id.bt_7: case R.id.bt_8: case R.id.bt_9: input_text.setText(str + ((Button) v).getText()); break; case R.id.bt_point: if (!str.contains(".")) input_text.setText(str + ((Button) v).getText()); break; case R.id.bt_plus: case R.id.bt_minuse: case R.id.bt_multipy: case R.id.bt_divide: if(str.equals("")); else { char a =str.charAt(str.length()-1); Log.i("str",str+""); Log.i("最后一位字符",a+""); if( a ==' ' ); else { input_text.setText(str + " " + ((Button) v).getText() + " "); } a =str.charAt(str.length()-1); break; } break; case R.id.bt_clear: input_text.setText(null); break; case R.id.bt_del: if (str != null && !str.equals("")) { input_text.setText(str.substring(0, str.length() - 1)); } break; case R.id.bt_dengyu: getRseult(); break; } } //运算结果 private void getRseult() { String str = input_text.getText().toString(); if (str == null || str.equals("")) return; if(!str.contains("+") &&!str.contains("-")&&!str.contains("×")&&!str.contains("÷") ) return; //遍历计算result double result = 0; char a =str.charAt(str.length()-2); if(a == '+' || a == '-'){ str = str + '0'; } else if(a == '×' || a == '÷'){ str = str + '1'; } int i = 0; int start = 0; char temp =' '; int flag = 1; if(!str.contains("+") &&!str.contains("-")){ result += calculate_include_multy_or_minuse(str); } else { for (; i < str.length(); i++) { char c = str.charAt(i); if (c == '+' || c == '-') { String s1 = str.substring(start, i); Log.i("S1是", s1 + ""); if(flag == 0) result -= calculate_include_multy_or_minuse(s1); else result += calculate_include_multy_or_minuse(s1); start = i + 1; if(c == '-') flag = 0; else flag = 1; String s2 = str.substring(start, str.length()); Log.i("S2是", s2 + ""); if (s2.contains("+") || s2.contains("-")) { temp = c; continue; } else { if(flag == 0) { result -= calculate_include_multy_or_minuse(s2); } else result += calculate_include_multy_or_minuse(s2); } } } } int r = 0; String result_string = Double.toString(result);
if(Double.toString(result) == "Infinity") input_text.setText("傻啊?除数为0"); else if ((int)result == result){ r = (int)result; input_text.setText(r + ""); } else input_text.setText(result + ""); } private double calculate(String s) { double sum = 1; int start = 0; int flag = 0; int flag2 = 0; s = s + '×'; char op = ' '; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c == '×' || c == '÷') { if (flag2 == 0) op = c; String s1 = s.substring(start, i); if (flag == 0) { sum *= Double.parseDouble(s1); // Log.i("第一个是"," "+sum); flag = 1; flag2 = 1; } else { switch (op) { case '×': // Log.i("s1是"," "+s1); sum = sum * Double.parseDouble(s1); // Log.i("sum是"," "+sum); break; case '÷': // Log.i("s2是"," "+s1); sum = sum / Double.parseDouble(s1); // Log.i("sum是"," "+sum); break; } } op = c; start = i + 1; } } // Log.i("sum的结果是", " " + sum); return sum; } private double calculate_include_multy_or_minuse(String s) { double sum = 0; if (s.contains("×") || s.contains("÷")) { sum = calculate(s); } else { sum = Double.parseDouble(s); } return sum; } }