按下退格键时应用程序崩溃

时间:2013-01-26 23:23:16

标签: android

我正在尝试在构建Android应用程序时学习java。我有一个没有按钮的积分计算器,它使用textchange监听器来计算总数。当按下退格键并且该框为空时它会崩溃。我尝试使用下面的代码验证(仅在字段上验证开始)。但它不起作用。任何帮助将不胜感激。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_wwcalc);
    etFat = (EditText)findViewById(R.id.editTextFat);
    etFiber = (EditText)findViewById(R.id.editTextFiber);
    etProtein = (EditText)findViewById(R.id.editTextProtein);
    etCarbs = (EditText)findViewById(R.id.editTextCarbs);
    tvTotal = (TextView)findViewById(R.id.textViewPoints);

    TextWatcher watcher = new TextWatcher() {

        @Override 
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub
            if(isEmpty(etFat) == false){
                intFat = Integer.parseInt(etFat.getText().toString());
            }
            else{

                etFat.setText("0");
                etFat.hasFocus();
                return;
            }
            intProtein =   Integer.parseInt(etProtein.getText().toString());
            intFiber = Integer.parseInt(etFiber.getText().toString());
            intCarbs = Integer.parseInt(etCarbs.getText().toString());
            calculate();
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            // TODO Auto-generated method stub

        }


    };

    etFat.addTextChangedListener(watcher);
    etProtein.addTextChangedListener(watcher);
    etFiber.addTextChangedListener(watcher);
    etCarbs.addTextChangedListener(watcher);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_wwcalc, menu);

return true;

}
public void calculate(){
    //intTot = intFat + intCarbs + intFiber + intProtein;
    intTot = (int) Math.ceil((intFat * (4/35)) + (intCarbs * (4/36.84)) - (intFiber* (4/50))+ (intProtein * (4/43.75)) ) ;
    tvTotal.setText(Integer.toString(intTot));
}
private boolean isEmpty(EditText etText)
{
 if(etText.getText().toString().trim().length() > 0 || etText.getText().toString().trim() != null)
    return false;
 else
   return true; 
}

}

感谢大家的帮助。如果有人认为有更好的方式让我知道,我不确定它是不是最好的解决方案。 conor建议的try catch捕获异常,然后只插入0 set焦点并选择0

try {
                intFat = Integer.parseInt(etFat.getText().toString());
            } catch (NumberFormatException e) {
                // TODO Auto-generated catch block
                etFat.setText("0");
                etFat.hasFocus();
                etFat.selectAll();
            }

2 个答案:

答案 0 :(得分:2)

如果没有看到堆栈跟踪,很难知道,但无论如何我都要去做它。

isEmpty()函数的以下部分允许在框仍然是emtpy时返回false。

etText.getText().toString().trim() != null

这意味着当您按退格键并清除该字段时它是空的,但您的功能表明它不是。然后是踢球者,当你的应用认为该字段不为空时,它试图解析内容的整数值(不存在)。这种解析尝试会引发异常并使您的应用崩溃。

我希望堆栈跟踪显示应用程序在此行崩溃

intFat = Integer.parseInt(etFat.getText().toString());

值得注意的是,您应该始终使用try,catch块来围绕Integer.parseInt()这样的调用。

希望有所帮助。

答案 1 :(得分:0)

异常应该由Integer.parseInt,

引起
intFat = Integer.parseInt(etFat.getText().toString());
ntProtein = Integer.parseInt(etProtein.getText().toString());
intFiber = Integer.parseInt(etFiber.getText().toString());
intCarbs = Integer.parseInt(etCarbs.getText().toString());

如果将包含空格的字符串传递给parseInt,则会抛出NumberFormatException,您需要修剪文本,然后设置它们,例如,

intFat = Integer.parseInt(etFat.getText().toString().trim());