Kotlin アプリ開発 vol.1-4 エラーメッセージを考える

RM計算機

RM計算アプリの改良を検討

前回得た知識を使ってRM計算アプリを少し改良してみました。

RM計算アプリ 2021-05-09

普通に使う分には問題ないですが、気になるところも出てきました。

  • ウエイトに0以下の値が入力できてしまう。
  • rep数に0以下の値が入力できてしまう。
  • rep数が多ぎるとRM計算の精度は悪くなる
  • rep数が1のときは式通りだと、おかしな結果が出てしまう

1RM = 重量 (1 + 回数 ÷ 40 ) で算出できる。

  ⇒ 1RM ≠ 1repの重量 * 41/40 

以前、使った未入力時のエラーメッセージを応用して条件を増やしてみます。

細かい部分を作りこむ

0以下の値が入力できてしまう

        val button5 = findViewById<Button>(R.id.b_calc)
        button5.setOnClickListener {

            var isValid = true

            val get_weight = findViewById<EditText>(R.id.e_weight)
            val st_weight = get_weight.text.toString()
            val weight = st_weight.toDouble()

            if (weight < 0.1) {
                get_weight.error = getString(R.string.e_weight_error_1)
                isValid = false
            }

      (中略)

            if (isValid == true) {
                val onerm = weight * rep / 40.0 + weight

あまりifに触れてこなかったので、なにをやっているのか説明しておきます。

上記のコードでやっていること
  • ボタンが押されたときに実行する内容を決める
  • 判定用の変数 (isValid)にtrueをセットする
  • EditTextからテキストを取り出して小数に変換
  • 値が0.1未満のときはエラーメッセージを表示して、falseをセットする
  • trueのままであれば、RMを計算する

rep数が多すぎる場合もエラーを出す。

以下のように重ねて条件を書くだけです。

            if (rep < 1.0) {
                get_rep.error = getString(R.string.e_rep_error_1)
                isValid = false
            }
            if (rep > 20.0) {
                get_rep.error = getString(R.string.e_rep_error)
                isValid = false
            }

e_rep_error_1は ”自然数で入力してください

e_rep_errorは “rep数が多すぎると精度が落ちます“ と表示しています。

rep数が1のときは別の式を使う

取得した値をそのまま表示するようにしました。

            if (rep == 1.0) {
                val onerm = weight
                val set_onerm = findViewById<TextView>(R.id.tv_1rm)
                set_onerm.text = String.format("%.1fkg", onerm)
                isValid = false
            }

入力内容はDouble型になっているので、小数1桁まででformatしています。

エラーメッセージの消し方は?

エラーメッセージの消し方

エラーメッセージは出るようになったけど消えません。

Kotlin エラーメッセージ消えない

エラーメッセージを設定しているがリセットするコードが入っていない

このサイトを参考にした。 = null とすればよいらしい。

AndroidのEditTextとTextInputLayoutを使ってエラーメッセージとポップアップメッセージなしのエラーアイコンを表示する - Qiita
概要 EditTextにはsetErrorメソッドが用意されており、自分でTextViewを用意してVisible/Goneをしなくてもエラーメッセージやアイコンを表示できます。 以下のMaterialDesignのサイトにある...

さらに発展的なことをやっているようなので次回、参考にしたい。

            get_rep.error = null
            get_weight.error = null

この2文を入れたらエラーメッセージは初期化される。

リセットをかけるタイミング

計算ボタンを押したタイミングで最初にリセットをかけるようにしました。

        val button5 = findViewById<Button>(R.id.b_calc)
        button5.setOnClickListener {

       //判定用のフラグセット & エラーメッセージの初期化
            var isValid = true
            get_rep.error = null
            get_weight.error = null

       //weightの値を取得
            val get_weight = findViewById<EditText>(R.id.e_weight)
            val st_weight = get_weight.text.toString()
            val weight = st_weight.toDouble()

       //weightの値が 空欄 or 0.1未満のときにエラー
            if (st_weight.isEmpty()) {…}
            if (weight < 0.1) {…}

       /repの値を取得
            val get_rep = findViewById<EditText>(R.id.e_rep)
            val st_rep = get_rep.text.toString()
            val rep = st_rep.toDouble()

       //repの値が 空欄 or 1未満 or 20より大きいのときにエラー
            if (st_rep.isEmpty()) {…}
            if (rep < 1.0) {…}
            if (rep > 20.0) {…}

            //repが1のときはそのまま値を返す
            if (rep == 1.0) {…}

       //すべて当てはまらない場合はRMを計算する
            if (isValid == true) {…}
        }
    }
}

他のアプリの再ベンチマーク

今回改良した部分の仕様を確認してみた。

このアプリのほうが優れている点

  • rep数やweightはそもそも0以下の値にならない
  • 入力の完了によって計算を実行するので1ステップ動作を省略している

まとめ

エラーメッセージの出し方/消し方を学んだ
入力された値次第で状態を遷移させるようにした
次回はアプリ側でエラー状態を事前に防ぐ方法を学ぶ

コメント

タイトルとURLをコピーしました