手记

Android工程师入门第一季——简易计算器。

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+"");
    }
}
1人推荐
随时随地看视频
慕课网APP