arrow_back

プログラム解説

ここでは、電卓アプリの動作をステップ毎に見ていきます。

ステップ1 起動

    int recentOperator = R.id.button_equal; // 最近押された計算キー
    double result;  // 計算結果
    boolean isOperatorKeyPushed;    // 計算キーが押されたことを記憶

まず、アプリの起動直後は次の通りです。フィールドresultは0、フィールドrecentOperatorはR.id.equalに初期化された状態です。

数値は入力されていません。

ステップ2 数字の入力 1

View.OnClickListener buttonNumberListener = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Button button = (Button) view;

        if (isOperatorKeyPushed == true) {
            editText.setText(button.getText());
        } else {
            editText.append(button.getText());
        }

        isOperatorKeyPushed = false;
    }
};

ユーザーが数字キーを押すと、editTextの内容が書き換わります。この時点ではフィールドresultの内容に影響はありません。

ステップ3 計算キーの入力 1

editTextが入力された状態で計算キー + が押された場合を考えてみましょう。

計算キーが押されると、editTextの内容を数値に変換して、ローカル変数valueに格納します。

続いてrecentOperatorの値がR.id.button_equalであるので、フィールドresultに格納します。

    View.OnClickListener buttonOperatorListener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Button operatorButton = (Button) view;
            double value = Double.parseDouble(editText.getText().toString());
            if (recentOperator == R.id.button_equal) {
                result = value;
            } else {
                result = calc(recentOperator, result, value);
                editText.setText(String.valueOf(result));
            }

            recentOperator = operatorButton.getId();
            textView.setText(operatorButton.getText());
            isOperatorKeyPushed = true;
        }
    };

また、この時点でフィールドrecentOperatorに押した計算キーのidを再代入し、フィールドisOperatorPushedをtrueにします。 このisOperatorPushedは、次に数字キーが押されたときに別の値として取り扱うために利用します。

ステップ4 数字の入力 2

View.OnClickListener buttonNumberListener = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Button button = (Button) view;

        if (isOperatorKeyPushed == true) {
            editText.setText(button.getText());
        } else {
            editText.append(button.getText());
        }

        isOperatorKeyPushed = false;
    }
};

次にユーザーが数字キーを押すと、フィールドisOperatorPushedがtrueであれば、新しい数字として取り扱います。 また、数字キーが押された時点でisOperatorPushedをfalseにします。

    View.OnClickListener buttonOperatorListener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Button operatorButton = (Button) view;
            double value = Double.parseDouble(editText.getText().toString());
            if (recentOperator == R.id.button_equal) {
                result = value;
            } else {
                result = calc(recentOperator, result, value);
                editText.setText(String.valueOf(result));
            }

            recentOperator = operatorButton.getId();
            textView.setText(operatorButton.getText());
            isOperatorKeyPushed = true;
        }
    };

ステップ4 計算キーの入力 2

ユーザーがさらに計算キーを押すと、その時点でeditTextに入力されている値を数値に変換してローカル変数valueに格納します。 calcメソッドは、フィールドresultとvalueの値に対して、フィールドrecentOperatorで示される計算処理を実行します。

    double calc(int operator, double value1, double value2) {
        switch (operator) {
            case R.id.button_add:
                return value1 + value2;
            case R.id.button_subtract:
                return value1 - value2;
            case R.id.button_multiply:
                return value1 * value2;
            case R.id.button_divide:
                return value1 / value2;
            default:
                return value1;
        }
    }

calcメソッドの処理結果は、フィールドresultに再代入して、計算結果としてeditTextに表示します。

押した計算キーに応じた処理の変化

このアプリではユーザーが計算キー = を押した後、数字キーを押すと、新しい計算として取り扱います(ステップ1へ)。

ユーザーが = 以外の計算キーを入力したあと数字キーを押した場合は、計算結果を保ったまま連続で計算します(ステップ4へ)。

最終更新日: 2015/09/01