Android-计算器逻辑帮助

问题描述

| 我创建了一个自定义对话框,该对话框是用于加,减,乘和除的简单计算器。我无法正确设置代码的逻辑。有没有人有任何智慧的话或对资源的了解,我可以检查一下是否有帮助。 以下是我的自定义对话框和我正在使用的计算器逻辑的代码。因为所有的计算工作正常,除了当我使用equals按钮时。在那之后我做的计算不正确。 谢谢! 计算器http://img546.imageshack.us/img546/9534/devicee.png
public class CustomCalcDialog extends Dialog {

    public CustomCalcDialog(Context context) {
        super(context);
    }

    EditText calcDialogdisplay;
    TextView enterTotal;
    TextView allClear;
    TextView seven;
    TextView eight;
    TextView nine;
    TextView division;
    TextView four;
    TextView five;
    TextView six;
    TextView multiply;
    TextView one;
    TextView two;
    TextView three;
    TextView subtract;
    TextView decimal;
    TextView zero;
    TextView equals;
    TextView addition;

    ArrayList<Float> mathVariables = new ArrayList<Float>();
    float mathVariable1;
    float mathVariable2;

    int currentOperation = 0;
    int nextOperation;

    final static int ADD = 1;
    final static int SUBTRACT = 2;
    final static int MULTIPLY = 3;
    final static int DIVISION = 4;
    final static int EQUALS = 5;

    final static int CLEAR = 1;
    final static int DONT_CLEAR = 0;
    int clearCalcdisplay = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.calculator_dialog);

        calcDialogdisplay = (EditText) findViewById(R.id.calc_dialog_display);
        enterTotal = (TextView) findViewById(R.id.enter_total);
        allClear = (TextView) findViewById(R.id.all_clear);
        seven = (TextView) findViewById(R.id.seven);
        eight = (TextView) findViewById(R.id.eight);
        nine = (TextView) findViewById(R.id.nine);
        division =(TextView) findViewById(R.id.division);
        four = (TextView) findViewById(R.id.four);
        five = (TextView) findViewById(R.id.five);
        six =(TextView) findViewById(R.id.six);
        multiply = (TextView) findViewById(R.id.multiply);
        one = (TextView) findViewById(R.id.one);
        two = (TextView) findViewById(R.id.two);
        three = (TextView) findViewById(R.id.three);
        subtract = (TextView) findViewById(R.id.subtract);
        decimal = (TextView) findViewById(R.id.decimal);
        zero = (TextView) findViewById(R.id.zero);
        equals = (TextView) findViewById(R.id.equals);
        addition = (TextView) findViewById(R.id.addition);

        calcDialogdisplay.setKeyListener(DigitsKeyListener.getInstance(true,true));

        registerListeners();
    }

    public void registerListeners () {

        enterTotal.setonClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                activeTextView.setText(calcDialogdisplay.getText().toString());
                mathCalculations();
                CustomCalcDialog.this.dismiss();
            }
        });

        allClear.setonClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                calcDialogdisplay.setText(\"\");
                mathVariable1 = 0;
                mathVariable2 = 0;
                mathVariables.removeAll(mathVariables);
                currentOperation = 0;
                nextOperation = 0;                  
            }
        });

        seven.setonClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (clearCalcdisplay == CLEAR) {
                    calcDialogdisplay.setText(\"\");
                }
                clearCalcdisplay = DONT_CLEAR;
                calcDialogdisplay.append(\"7\");

            }
        });

        eight.setonClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (clearCalcdisplay == CLEAR) {
                    calcDialogdisplay.setText(\"\");
                }
                clearCalcdisplay = DONT_CLEAR;
                calcDialogdisplay.append(\"8\");

            }
        });

        nine.setonClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (clearCalcdisplay == CLEAR) {
                    calcDialogdisplay.setText(\"\");
                }
                clearCalcdisplay = DONT_CLEAR;
                calcDialogdisplay.append(\"9\");

            }
        });

        division.setonClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                calcLogic(DIVISION);                    
            }
        });

        four.setonClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (clearCalcdisplay == CLEAR) {
                    calcDialogdisplay.setText(\"\");
                }
                clearCalcdisplay = DONT_CLEAR;
                calcDialogdisplay.append(\"4\");

            }
        });

        five.setonClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (clearCalcdisplay == CLEAR) {
                    calcDialogdisplay.setText(\"\");
                }
                clearCalcdisplay = DONT_CLEAR;
                calcDialogdisplay.append(\"5\");

            }
        });

        six.setonClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (clearCalcdisplay == CLEAR) {
                    calcDialogdisplay.setText(\"\");
                }
                clearCalcdisplay = DONT_CLEAR;
                calcDialogdisplay.append(\"6\");

            }
        });

        multiply.setonClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                calcLogic(MULTIPLY);

            }
        });

        one.setonClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (clearCalcdisplay == CLEAR) {
                    calcDialogdisplay.setText(\"\");
                }
                clearCalcdisplay = DONT_CLEAR;
                calcDialogdisplay.append(\"1\");

            }
        });

        two.setonClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (clearCalcdisplay == CLEAR) {
                    calcDialogdisplay.setText(\"\");
                }
                clearCalcdisplay = DONT_CLEAR;
                calcDialogdisplay.append(\"2\");

            }
        });

        three.setonClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (clearCalcdisplay == CLEAR) {
                    calcDialogdisplay.setText(\"\");
                }
                clearCalcdisplay = DONT_CLEAR;
                calcDialogdisplay.append(\"3\");

            }
        });

        subtract.setonClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                calcLogic(SUBTRACT);
            }               
        });

        decimal.setonClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (clearCalcdisplay == CLEAR) {
                    calcDialogdisplay.setText(\"\");
                }
                clearCalcdisplay = DONT_CLEAR;
                calcDialogdisplay.append(\".\");

            }
        });

        zero.setonClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (clearCalcdisplay == CLEAR) {
                    calcDialogdisplay.setText(\"\");
                }
                clearCalcdisplay = DONT_CLEAR;
                calcDialogdisplay.append(\"0\");

            }
        });

        equals.setonClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                calcLogic(EQUALS);

            }
        });

        addition.setonClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                calcLogic(ADD);
            }
        });
    }

    private void calcLogic(int operator) {

        mathVariables.add(Float.parseFloat(calcDialogdisplay.getText().toString()));

        if (operator != EQUALS) {
            nextOperation = operator;
        }else if (operator == EQUALS){
            nextOperation = 0;
        }

        switch (currentOperation) {
        case ADD:               
            mathVariable1 = mathVariables.get(0);
            mathVariable2 = mathVariables.get(1);

            mathVariables.removeAll(mathVariables);

            mathVariables.add(mathVariable1 + mathVariable2);

            calcDialogdisplay.setText(String.format(\"%.3f\",mathVariables.get(0)));
            break;
        case SUBTRACT:
            mathVariable1 = mathVariables.get(0);
            mathVariable2 = mathVariables.get(1);

            mathVariables.removeAll(mathVariables);

            mathVariables.add(mathVariable1 - mathVariable2);

            calcDialogdisplay.setText(String.format(\"%.3f\",mathVariables.get(0)));
            break;
        case MULTIPLY:
            mathVariable1 = mathVariables.get(0);
            mathVariable2 = mathVariables.get(1);

            mathVariables.removeAll(mathVariables);

            mathVariables.add(mathVariable1 * mathVariable2);

            calcDialogdisplay.setText(String.format(\"%.3f\",mathVariables.get(0)));
            break;
        case DIVISION:
            mathVariable1 = mathVariables.get(0);
            mathVariable2 = mathVariables.get(1);

            mathVariables.removeAll(mathVariables);

            mathVariables.add(mathVariable1 / mathVariable2);

            calcDialogdisplay.setText(String.format(\"%.3f\",mathVariables.get(0)));
            break;
        }

        clearCalcdisplay = CLEAR;
        currentOperation = nextOperation;
        if (operator == EQUALS) {
            mathVariable1 = 0;
            mathVariable2 = 0;
            mathVariables.removeAll(mathVariables);
        }
    }
}
    

解决方法

        考虑将您的应用分为两部分。 gui收集输入并选择操作。现在创建另一个类进行计算,例如Model.java。此类应提供采用参数并提供返回值的方法。测试这些隔离的方法的准确性和无效输入,超出范围的值和无意义的输入。设计模型要抛出的异常。现在,将GUI连接到模型。