0

私はこのコードを試しました(関連部分..):

    private EditText weightEditText,heightEditText;

    weightEditText = (EditText)findViewById(R.id.weightEditText); 
    heightEditText = (EditText)findViewById(R.id.heightEditText);

    public void onClick(View v) {
        switch (v.getId()){
        case R.id.clear: clearFields();toastClearingMessage(); break;
        case R.id.goButton: runGoButton(); break;
        }//switch
    }

    private void runGoButton() {
        if (heightWeightFieldsValuesGood() && heightWeightFieldsNotEmpty() )
            runCalculations();
        else
            toastMessageReEnterValues();
    }

    private boolean heightWeightFieldsValuesGood() {
        if (getWeight()>0 && getHeight()>0)
            return true;
        return false;
    }

    private boolean heightWeightFieldsNotEmpty(){
        if ( (weightEditText.getText().toString().trim().equals("")) || (heightEditText.getText().toString().trim().equals("")) )
            return false;
        return true;
    }
    private float getHeight() {
        return Float.parseFloat(heightEditText.getText().toString());
    }

    private float getWeight() {
        return Float.parseFloat(weightEditText.getText().toString());
    }

クラッシュログ:

10-08 01:21:54.260: W/dalvikvm(8172): threadid=1: thread exiting with uncaught exception (group=0x40020ac0)
10-08 01:21:54.260: E/AndroidRuntime(8172): FATAL EXCEPTION: main
10-08 01:21:54.260: E/AndroidRuntime(8172): java.lang.NumberFormatException: 
10-08 01:21:54.260: E/AndroidRuntime(8172):     at org.apache.harmony.luni.util.FloatingPointParser.parseFloat(FloatingPointParser.java:305)
10-08 01:21:54.260: E/AndroidRuntime(8172):     at java.lang.Float.parseFloat(Float.java:291)
10-08 01:21:54.260: E/AndroidRuntime(8172):     at com.example.bmi.calculator.MainPage.getWeight(MainPage.java:122)
10-08 01:21:54.260: E/AndroidRuntime(8172):     at com.example.bmi.calculator.MainPage.heightWeightFieldsValuesGood(MainPage.java:75)
10-08 01:21:54.260: E/AndroidRuntime(8172):     at com.example.bmi.calculator.MainPage.runGoButton(MainPage.java:63)
10-08 01:21:54.260: E/AndroidRuntime(8172):     at com.example.bmi.calculator.MainPage.onClick(MainPage.java:58)
10-08 01:21:54.260: E/AndroidRuntime(8172):     at android.view.View.performClick(View.java:2420)
10-08 01:21:54.260: E/AndroidRuntime(8172):     at android.view.View$PerformClick.run(View.java:8941)
10-08 01:21:54.260: E/AndroidRuntime(8172):     at android.os.Handler.handleCallback(Handler.java:587)
10-08 01:21:54.260: E/AndroidRuntime(8172):     at android.os.Handler.dispatchMessage(Handler.java:92)
10-08 01:21:54.260: E/AndroidRuntime(8172):     at android.os.Looper.loop(Looper.java:123)
10-08 01:21:54.260: E/AndroidRuntime(8172):     at android.app.ActivityThread.main(ActivityThread.java:4627)
10-08 01:21:54.260: E/AndroidRuntime(8172):     at java.lang.reflect.Method.invokeNative(Native Method)
10-08 01:21:54.260: E/AndroidRuntime(8172):     at java.lang.reflect.Method.invoke(Method.java:521)
10-08 01:21:54.260: E/AndroidRuntime(8172):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
10-08 01:21:54.260: E/AndroidRuntime(8172):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
10-08 01:21:54.260: E/AndroidRuntime(8172):     at dalvik.system.NativeStart.main(Native Method)

すべてが正常に実行されますが、フィールド値を挿入せずに GO ボタンをクリックすると、プログラムがクラッシュして閉じます...そして、trim() メソッドを使用していますが...

ちなみに、両方のフィールドにゼロの値を入力すると、正常に動作します (適切なトースト メッセージ) アイデアはありますか?... ありがとうございます! :-(

4

3 に答える 3

1

toString() を間違って使用しています。編集テキスト自体ではなく、editText の getText() メソッドで呼び出す必要があります。

また、' ' ではなく "" と比較する必要があります。

この場合、trim() は不要です。

次のようになります。

weightEditText.getText().toString().equals("") ...

<<<<<< 編集 >>>>>>>>

   private boolean heightWeightFieldsNotEmpty(){
    if ( (weightEditText.getText().toString().equals("")) || (heightEditText.getText().toString().equals("")) )
        return false;
    return true;
}

<<<<<<< 編集 2 >>>>>>>>>

    if (heightWeightFieldsNotEmpty() && heightWeightFieldsValuesGood())


  private float getHeight(){
        Float from_value;
        try{
            from_value = Float.parseFloat(heightEditText.getText().toString());
        } catch (NumberFormatException ex){
            from_value = 0.0f;
        }

        return from_value;
    }
于 2012-10-07T22:49:08.670 に答える
1

You could probably simplify some code with the use of TextUtils.

private boolean heightWeightFieldsNotEmpty(){
        if (TextUtils.isEmpty(weightEditText.getText()) || TextUtils.isEmpty(heightEditText.getText() )) {
            return false;
        }
        return true;
 }

and then in your runGoButton() method:

private void runGoButton() {
        // Reverse these since you need to check for empty first.
        if (heightWeightFieldsNotEmpty() && heightWeightFieldsValuesGood())
            runCalculations();
        else
            toastMessageReEnterValues();
}
于 2012-10-07T23:39:31.180 に答える
0

空の文字列は、トリミングされた場合、スペース文字を含む文字列と等しくなりません - 2 つの等号チェックからスペースを削除します

また、値を数値に変換する前に、フィールドが空でないことを確認する必要があります。つまり、チェックは次のようになります。

if (heightWeightFieldsNotEmpty() && heightWeightFieldsValuesGood())

注: また、余分な==trueを削除しました。これは、正確さのために不要であり、コードの正当性には何も追加しませんでした。「notEmpty」テストを最初に置くことで、失敗した場合、コードは「valuesGood」テストを実行しようとしないため、空の文字列に対する数値テストを回避できます

于 2012-10-07T22:46:40.870 に答える