Radio Button вылетает мое приложение при нажатии на него

Я создаю простое приложение калькулятора на Android Studio, и я столкнулся с одной проблемой, которую просто не могу понять. Мой калькулятор использует две радиокнопки для вычисления и два поля редактирования текста, чтобы получить числа от пользователя. Все работает так же, как и для расчетов, но когда я запускаю программу и нажимаю одну из переключателей, в которой нет ничего в двух полях редактирования текста, мое приложение вылетает. Кроме того, если оставить одно из полей для редактирования текста пустым, а затем щелкнуть любую из переключателей, чтобы выполнить вычисление, оно также аварийно завершает работу. Кроме того, я хочу, чтобы программа ничего не делала, когда эти экземпляры происходят, пока в двух полях редактирования текста не появятся числа для правильного вычисления. Может кто-нибудь объяснить, пожалуйста, что я делаю не так, и что мне нужно сделать, чтобы решить эту проблему. Благодарю вас!

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

public void onRadioButtonClicked(View v) {

    //this links the elements between the content on the screen and code together
    RadioGroup buttonGrouper = (RadioGroup) findViewById(R.id.buttonGrouper);
    RadioButton discountOffButton = (RadioButton) findViewById(R.id.discountOffButton);
    RadioButton percentageOfButton = (RadioButton) findViewById(R.id.percentageOfButton);
    EditText originalAmtInput = (EditText) findViewById(R.id.originalAmtInput);
    EditText percentageAmtInput = (EditText) findViewById(R.id.percentageAmtInput);
    TextView totalAmt = (TextView) findViewById(R.id.totalAmt);

    //calculation initializations and formulas
    float amount = Float.parseFloat(originalAmtInput.getText().toString());
    float percentage = Float.parseFloat(percentageAmtInput.getText().toString());
    float decimal = percentage / 100;
    float total = amount * decimal;
    float discountTotal = amount - total;

    //error checks variables
    String amountInput = originalAmtInput.getText().toString();
    String percentageInput = percentageAmtInput.getText().toString();

    boolean discountChecked = buttonGrouper.getCheckedRadioButtonId() == discountOffButton.getId();
    boolean percentageChecked = buttonGrouper.getCheckedRadioButtonId() == percentageOfButton.getId();

    if (discountChecked && !amountInput.isEmpty() && !percentageInput.isEmpty()) {
        totalAmt.setText(Float.toString(discountTotal));
        totalAmt.setText(String.format("$%.2f", discountTotal));
    }
    else if (percentageChecked && !amountInput.isEmpty() && !percentageInput.isEmpty()) {
        totalAmt.setText(Float.toString(total));
        totalAmt.setText(String.format("%.2f", total));
    }
    else {
        totalAmt.setText("");
    }

Мой Логкат:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.example.michaelzheng.percentagecalculatorapp, PID: 12575
              java.lang.IllegalStateException: Could not execute method for android:onClick
                  at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
                  at android.view.View.performClick(View.java:4780)
                  at android.widget.CompoundButton.performClick(CompoundButton.java:120)
                  at android.view.View$PerformClick.run(View.java:19866)
                  at android.os.Handler.handleCallback(Handler.java:739)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:135)
                  at android.app.ActivityThread.main(ActivityThread.java:5254)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at java.lang.reflect.Method.invoke(Method.java:372)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
               Caused by: java.lang.reflect.InvocationTargetException
                  at java.lang.reflect.Method.invoke(Native Method)
                  at java.lang.reflect.Method.invoke(Method.java:372)
                  at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
                  at android.view.View.performClick(View.java:4780) 
                  at android.widget.CompoundButton.performClick(CompoundButton.java:120) 
                  at android.view.View$PerformClick.run(View.java:19866) 
                  at android.os.Handler.handleCallback(Handler.java:739) 
                  at android.os.Handler.dispatchMessage(Handler.java:95) 
                  at android.os.Looper.loop(Looper.java:135) 
                  at android.app.ActivityThread.main(ActivityThread.java:5254) 
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at java.lang.reflect.Method.invoke(Method.java:372) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
               Caused by: java.lang.NumberFormatException: Invalid float: ""
                  at java.lang.StringToReal.invalidReal(StringToReal.java:63)
                  at java.lang.StringToReal.parseFloat(StringToReal.java:308)
                  at java.lang.Float.parseFloat(Float.java:306)
                  at com.example.michaelzheng.percentagecalculatorapp.MainActivity.onRadioButtonClicked(MainActivity.java:32)
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at java.lang.reflect.Method.invoke(Method.java:372) 
                  at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
                  at android.view.View.performClick(View.java:4780) 
                  at android.widget.CompoundButton.performClick(CompoundButton.java:120) 
                  at android.view.View$PerformClick.run(View.java:19866) 
                  at android.os.Handler.handleCallback(Handler.java:739) 
                  at android.os.Handler.dispatchMessage(Handler.java:95) 
                  at android.os.Looper.loop(Looper.java:135) 
                  at android.app.ActivityThread.main(ActivityThread.java:5254) 
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at java.lang.reflect.Method.invoke(Method.java:372) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

2 ответа

Хорошо, после долгого исследования этого вопроса я наконец-то нашел решение своей проблемы, прочитав эти два поста.

1-й пост: приложение падает, когда TextField пуст

2-й пост: Если EditText.getText().ToString() == "" не работает;

Что я сделал, так это добавил условие к моей сумме и процентной переменной инициализации

ДО:

 //calculation initialization and formulas
float amount = Float.parseFloat(originalAmtInput.getText().toString());
float percentage =Float.parseFloat(percentageAmtInput.getText().toString());

ПОСЛЕ:

 //calculation initializations and formulas  (note: ? = set to AND : = else set to)
    float amount = "".equals(originalAmtInput.getText().toString()) ? 0 : Float.parseFloat(originalAmtInput.getText().toString());
    float percentage = "".equals(percentageAmtInput.getText().toString()) ? 0 : Float.parseFloat(percentageAmtInput.getText().toString());

Какие "".equals(originalAmtInput.getText().toString()) ? 0 : Float.parseFloat(originalAmtInput.getText().toString()) означает, что он проверяет, является ли поле для редактирования текста оригинала AmtInput пустым, сравнивая его с "". Таким образом, если он пуст, он установит значение на 0. В противном случае значение будет установлено на входные числа пользователя.

Может быть, вы должны сделать Toast, который говорит пользователю вводить что-то в EditText, если EditText пуст, я думаю, что это должно решить проблему?

Другие вопросы по тегам