如何在两个活动上制作计算器

How to make calculator over two activities

我制作了一个应用程序,用户可以在其中选择食物类型、输入重量,然后该应用程序会计算卡路里。然后将此卡路里移动到 MainActivity(当按下 'Save' 按钮时),其中将显示当天的总卡路里。

我需要该应用程序计算所有计算的卡路里并将它们添加到主 activity 上的任何现有值。我写了下面的代码,但是当我第二次按下保存按钮时,应用程序崩溃了 activity。

String greeting = getIntent().getStringExtra("Greeting Message");
EditText editText1 = (EditText)findViewById(R.id.editText1);
String value = editText1.getText().toString();

Integer aValue = (value != null && !value.isEmpty()) ? Integer.parseInt(value) : 0 ;
Integer bValue = (greeting != null && !greeting.isEmpty()) ? count +=Integer.parseInt(greeting) : 0 ;

editText1.setText(count + "");

堆栈错误:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.nicola.student.mealtracker/com.nicola.student.mealtracker.MainActivity}: java.lang.NumberFormatException: Invalid int: "70.0Cal"

valuegreeting 具有无法转换为 int 的值:“70.0Cal”。
所以删除后缀 "Cal" ,如果你必须处理分数,请使用 double 而不是 int.

您应该检查您的值字符串,您的异常告诉我该字符串是“70.0Cal”。首先,如果您知道最后三个符号总是 "Cal"

,您可以获得一个子字符串
     String value = value.substring(0,substring.length()-3);

其次,你有一个十进制值,所以你不应该使用整数,你应该使用浮点数或双精度数。

此外,您应该检查 EditText 中的文本是否不为 null 或为空:

     String edittextText = editText1.getText().toString();

     if(edittextText!=null && !edittextText.equals("")){
      //start calculating

     }

查看提供的短堆栈跟踪,我可以看到您正在解析一个 String 格式不正确的 Integer 值。

您必须对该字段进行一些验证,以确保提供的输入是有效的数值。您可以使用以下方法或设置 EditText 输入类型 android:inputType="number"

/**
 * Checks if the text is a valid numeric value
 * @param value
 * @return valid
 */
public static boolean isNumeric(String value) {
    if (!isNull(value)) {
        if (value.matches("[-+]?\d*\.?\d+")) {
            return true;
        }
    }

    return false;
}

我建议不要将 Cal 附加到返回值。保留输入的数字。而是在 EditText 旁边的 TextView 中添加 "Cal" 值。 通过使用 isNumeric 方法在解析之前检查值,以这种方式实现它。

public void executeYourCode() {
    //Parse your values to Double 
    //as you are using Double values
    Double aValue =  getCheckedValue(value) ;
    Double bValue = getCheckedValue(greeting);

    count+= bValue;
    editText1.setText(String.valueOf(count));
}

public int getCheckedValue(String value) {
    if (value != null && !value.isEmpty() && isNumeric(value)) {
        return Double.parseDouble(value.trim());
    }

    return 0;
}