【初心者がAndroid Studio+kotlinで電卓アプリを作ってみる】第12回:完結編

kotlinで電卓アプリ作成

電卓アプリを作ってみるシリーズ一覧はこちらをクリック

第1回から見たい人は下のリンクから↓↓

出来たー!!

あとがき

多分いっぱいバグあるんだろうなー、変数名長すぎたなー、直そうかなとも考えたけどコード変えて記事の画像も変えて…って大変なのでもういいか。うん、良しとします。

もし次に何かアプリを作るときのヒントになると信じてこのままにしておこうと思います。

package com.example.calculatorapplication
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.calculatorapplication.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)
        // 値を格納する変数
        var valueForTempStorage = 0.0 // 一時保存用の値
        var valueForCalc1st = 0.0 // 計算用の値1番目
        var valueForCalc2nd = 0.0 // 計算用の値2番目
        var valueForResults = 0.0 // 結果用の値
        // 記号を格納する変数
        var symbolForTempStorage = "" // 一時保存用の記号
        // 小数チェック用の変数
        var stringForPointZeroCheck = "" // .0チェック用の文字列
        var flagForDecimal = false // 小数チェック用のフラグ
        var flagForDecimal2 = false // 小数チェック用のフラグ2
        // 関数(fun)数字(numbers)タップした(Tapped)
        fun numbersTapped(namString: String) {
            if (flagForDecimal2 == true) {
                // 結果画面の文字と押された数字を結合して結果画面に表示する
                binding.textViewValuedisplay.text = binding.textViewValuedisplay.text.toString() + namString
                // 一時保存用の値にダブル型で結果を入れておく
                valueForTempStorage = binding.textViewValuedisplay.text.toString().toDouble()
            }
            else {
                valueForTempStorage = valueForTempStorage * 10 + namString.toInt()
                binding.textViewValuedisplay.text = valueForTempStorage.toInt().toString()
            }
        }
        // 関数(fun)演算子(operator)タップした(Tapped)
        fun operatorTapped() {
            if (valueForCalc1st == 0.0 && symbolForTempStorage == "") {
                valueForCalc1st = valueForTempStorage
                valueForTempStorage = 0.0
            }
            else if (valueForCalc2nd == 0.0) {
                valueForCalc2nd = valueForTempStorage
                valueForTempStorage = 0.0
                if (symbolForTempStorage == "+") {
                    valueForResults = valueForCalc1st + valueForCalc2nd
                }
                else if (symbolForTempStorage == "-") {
                    valueForResults = valueForCalc1st - valueForCalc2nd
                }
                else if (symbolForTempStorage == "*") {
                    valueForResults = valueForCalc1st * valueForCalc2nd
                }
                else if (symbolForTempStorage == "/") {
                    valueForResults = valueForCalc1st / valueForCalc2nd
                }
                else if (symbolForTempStorage == "=") {
                    return
                }
                stringForPointZeroCheck = valueForResults.toString()
                stringForPointZeroCheck = stringForPointZeroCheck.indexOf(".0").toString()
                if (stringForPointZeroCheck == "-1") {
                    flagForDecimal = true
                }
                if (flagForDecimal) {
                    binding.textViewValuedisplay.text = valueForResults.toString()
                }
                else {
                    binding.textViewValuedisplay.text = valueForResults.toInt().toString()
                }
                valueForCalc1st = valueForResults
                valueForCalc2nd = 0.0
                valueForResults = 0.0
                flagForDecimal = false
            }
            flagForDecimal2 = false
        }
        // 0ボタンが押された時
        binding.buttonZero.setOnClickListener {
            numbersTapped("0")
        }
        // 1ボタンが押された時
        binding.buttonOne.setOnClickListener {
            numbersTapped("1")
        }
        // 2ボタンが押された時
        binding.buttonTwo.setOnClickListener {
            numbersTapped("2")
        }
        // 3ボタンが押された時
        binding.buttonThree.setOnClickListener {
            numbersTapped("3")
        }
        // 4ボタンが押された時
        binding.buttonFour.setOnClickListener {
            numbersTapped("4")
        }
        // 5ボタンが押された時
        binding.buttonFive.setOnClickListener {
            numbersTapped("5")
        }
        // 6ボタンが押された時
        binding.buttonSix.setOnClickListener {
            numbersTapped("6")
        }
        // 7ボタンが押された時
        binding.buttonSeven.setOnClickListener {
            numbersTapped("7")
        }
        // 8ボタンが押された時
        binding.buttonEight.setOnClickListener {
            numbersTapped("8")
        }
        // 9ボタンが押された時
        binding.buttonNine.setOnClickListener {
            numbersTapped("9")
        }
        // .ボタンが押された時
        binding.buttonPoint.setOnClickListener {
            // いきなり"."が押された場合は無視する、"."連打も無視する
            if (binding.textViewValuedisplay.text != "" && flagForDecimal2 != true) {
                flagForDecimal2 = true
                numbersTapped(".")
            }
        }
        // +ボタンが押されたとき
        binding.buttonAddition.setOnClickListener {
            operatorTapped ()
            symbolForTempStorage = "+"
        }
        // -ボタンが押されたとき
        binding.buttonSubtraction.setOnClickListener {
            operatorTapped ()
            symbolForTempStorage = "-"
        }
        // ×ボタンが押されたとき
        binding.buttonMultiplication.setOnClickListener {
            operatorTapped ()
            symbolForTempStorage = "*"
        }
        // ÷ボタンが押されたとき
        binding.buttonDivision.setOnClickListener {
            operatorTapped ()
            symbolForTempStorage = "/"
        }
        // =ボタンが押されたとき
        binding.buttonEqual.setOnClickListener {
            operatorTapped ()
            symbolForTempStorage = "="
        }
        // ACボタンが押されたとき
        binding.buttonAllClear.setOnClickListener {
            valueForTempStorage = 0.0
            valueForCalc1st = 0.0
            valueForCalc2nd = 0.0
            valueForResults = 0.0
            flagForDecimal = false
            flagForDecimal2 = false
            symbolForTempStorage = ""
            binding.textViewValuedisplay.text = ""
        }
    }

コメント