【问题标题】:Putting Toast to button so it doesn't crash把 Toast 放到按钮上,这样它就不会崩溃
【发布时间】:2016-02-17 19:17:50
【问题描述】:

所以我的应用程序的一部分是我成功编码的各种计算器,但如果用户没有在EditText 字段中输入任何数字,应用程序强制关闭。

第二个 EditText 字段的值不得大于 12,并且 Toast 在那里工作,但是如果用户没有在第一个 EditText 或第二个或两者中输入值,我应该写什么以便打印 Toast?

这是我的代码,您可以查看我的尝试:

public class Kalkulatori1RM extends AppCompatActivity {
EditText polje1, polje2;
TextView rezultat1RM;
Button btnIzracunaj1RM;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_kalkulatori1_rm);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    Intent intent = getIntent();}

    public boolean isEmpty(EditText etText) {





    polje1 = (EditText) findViewById(R.id.edit1rmTezina);
    polje2 = (EditText) findViewById(R.id.edit1rmPonavljanja);

    rezultat1RM = (TextView) findViewById(R.id.text1RMJe);

    btnIzracunaj1RM = (Button) findViewById(R.id.btnIzracunaj1RM);



    btnIzracunaj1RM.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(isEmpty(polje1)||isEmpty(polje2)){
                Toast.makeText(Kalkulatori1RM.this, "Both inputs must be provided prior to calculating",Toast.LENGTH_LONG).show();
            } else {

            double prvoPolje = Double.parseDouble(polje1.getText().toString());
            double drugoPolje = Double.parseDouble(polje2.getText().toString());

            double rezultat = 0;


            if (drugoPolje == 1) {
                rezultat = prvoPolje * 1;

            } else if (drugoPolje == 2) {
                rezultat = prvoPolje * 1.05;

            } else if (drugoPolje == 3) {
                rezultat = prvoPolje * 1.08;

            } else if (drugoPolje == 4) {
                rezultat = prvoPolje * 1.11;

            } else if (drugoPolje == 5) {
                rezultat = prvoPolje * 1.15;

            } else if (drugoPolje == 6) {
                rezultat = prvoPolje * 1.18;

            } else if (drugoPolje == 7) {
                rezultat = prvoPolje * 1.20;

            } else if (drugoPolje == 8) {
                rezultat = prvoPolje * 1.25;

            } else if (drugoPolje == 9) {
                rezultat = prvoPolje * 1.30;

            } else if (drugoPolje == 10) {
                rezultat = prvoPolje * 1.33;

            } else if (drugoPolje == 11) {
                rezultat = prvoPolje * 1.37;

            } else if (drugoPolje == 12) {
                rezultat = prvoPolje * 1.43;

            } else if (drugoPolje > 12) {
                Toast.makeText(getApplicationContext(), "Broj ponavljanja ne smije biti veći od 12", Toast.LENGTH_LONG).show();

            } else {
                Toast.makeText(Kalkulatori1RM.this, "Unesite odgovarajuće podatke prije nego što pritisnete na 'Izračunaj'", Toast.LENGTH_LONG).show();
            }

            rezultat = Math.round(rezultat * 100.0) / 100.0;
            rezultat1RM.setText(Double.toString(rezultat));


        }
    }

    });

    return etText.getText().toString().trim().length() == 0;

}

有什么想法吗?

这是错误:

02-17 20:35:08.454 1609-1609/hr.app.liftme.liftmehr E/AndroidRuntime: FATAL EXCEPTION: main
                                                                      Process: hr.app.liftme.liftmehr, PID: 1609
                                                                      java.lang.NumberFormatException: Invalid double: ""
                                                                          at java.lang.StringToReal.invalidReal(StringToReal.java:63)
                                                                          at java.lang.StringToReal.parseDouble(StringToReal.java:267)
                                                                          at java.lang.Double.parseDouble(Double.java:301)
                                                                          at hr.app.liftme.liftmehr.Kalkulatori1RM$1.onClick(Kalkulatori1RM.java:51)
                                                                          at android.view.View.performClick(View.java:4856)
                                                                          at android.view.View$PerformClick.run(View.java:19956)
                                                                          at android.os.Handler.handleCallback(Handler.java:739)
                                                                          at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                          at android.os.Looper.loop(Looper.java:211)
                                                                          at android.app.ActivityThread.main(ActivityThread.java:5389)
                                                                          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:1020)
                                                                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)

【问题讨论】:

  • 我建议使用EditText.setError() 而不是Toast。另外,您是否考虑过改用Spinner

标签: java android toast


【解决方案1】:

如果字符串不包含可解析的双精度,则应用程序强制关闭,因为 Double.parseDouble 会抛出 NumberFormatException。您必须自己捕获异常,如 here 所示。

【讨论】:

    【解决方案2】:

    如果您检查了Logcat,您可能会看到您正在尝试通过Double.parseDouble(...)null 或空白字符串解析为double

    最好在执行计算之前检查您的输入,这样......

    //Place in a global reference (static Utils class or something)
    public boolean isEmpty(EditText etText) {
      return etText.getText().toString().trim().length() == 0;
    }
    
    
    btnIzracunaj1RM.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
         if(isEmpty(polje1)||isEmpty(polje2)){
            Toast.makeText(this,"Both inputs must be provided prior to calculating",Toast.LENGTH_LONG).show();
         } else {
           double prvoPolje = Double.parseDouble(polje1.getText().toString());
            double drugoPolje = Double.parseDouble(polje2.getText().toString());
    
            double rezultat = 0;
    
    
            if (drugoPolje == 1) {
                rezultat = prvoPolje * 1;
    
            } else if (drugoPolje == 2) {
                rezultat = prvoPolje * 1.05;
    
            } else if (drugoPolje == 3) {
                rezultat = prvoPolje * 1.08;
    
            } else if (drugoPolje == 4) {
                rezultat = prvoPolje * 1.11;
    
            } else if (drugoPolje == 5) {
                rezultat = prvoPolje * 1.15;
    
            } else if (drugoPolje == 6) {
                rezultat = prvoPolje * 1.18;
    
            } else if (drugoPolje == 7) {
                rezultat = prvoPolje * 1.20;
    
            } else if (drugoPolje == 8) {
                rezultat = prvoPolje * 1.25;
    
            } else if (drugoPolje == 9) {
                rezultat = prvoPolje * 1.30;
    
            } else if (drugoPolje == 10) {
                rezultat = prvoPolje * 1.33;
    
            } else if (drugoPolje == 11) {
                rezultat = prvoPolje * 1.37;
    
            } else if (drugoPolje == 12) {
                rezultat = prvoPolje * 1.43;
    
            } else if (drugoPolje > 12) {
                Toast.makeText(getApplicationContext(), "Broj ponavljanja ne smije biti veći od 12", Toast.LENGTH_LONG).show();
    
            } else {
                Toast.makeText(Kalkulatori1RM.this, "Unesite odgovarajuće podatke prije nego što pritisnete na 'Izračunaj'", Toast.LENGTH_LONG).show();
            }
    
            rezultat = Math.round(rezultat * 100.0) / 100.0;
            rezultat1RM.setText(Double.toString(rezultat));
    
         }
       }
    })
    

    另一种方法是将 isEmpty(...) 调用替换为 tryParseDouble...

    public boolean tryParseDouble(String str){
        try{
    
          double parsed = Double.parseDouble(str);
          return true;
        } catch (Exception e){
          return false;
        }
    }
    

    这可能是更好的方法。

    【讨论】:

    • @DaxHR 是的,它说 `java.lang.NumberFormatException: Invalid double: ""` 表示您正在尝试解析空白字符串。遵循我的实施将解决您的问题
    • 这样做,得到了大量无法解决 isEmpty 和其他问题的错误
    • 你是否包含了我写的isEmpty 方法?如果您不这样做,它将无法编译...重要的是找出您遇到错误的原因,而不是立即寻求帮助。
    • 我做到了。现在应用程序启动,但按钮不执行任何操作。请参阅我的 OP,代码已更新。不得不将该返回值放在最后,因为它给了我错误
    • 你为什么把所有的逻辑都包含在isEmpty 中?这就是为什么您必须将返回值放在那里的原因,因为它希望返回一个 boolean 值...确保您将波浪形括号 {} 包裹在他们所设想的周围。我将更新我的代码,以准确地向您展示您应该拥有的内容。
    【解决方案3】:

    由于您对其中一个输入的特定选择数量有限,我建议使用Spinner 而不是TextView。这样,您可以显示计算中使用的确切值,避免用户混淆。您也不再需要担心输入错误。

    对于任何允许输入任意数字的EditText,您需要确保输入有效。您可以通过以下两种方式之一执行此操作:

    1. 捕获NumberFormatException 并显示错误消息。

    2. EditTextinputType 设置为number

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-15
      • 2016-05-24
      • 1970-01-01
      • 2016-07-14
      • 2011-01-20
      • 2017-10-23
      • 2023-03-19
      • 1970-01-01
      相关资源
      最近更新 更多