4

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

@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 集焦点并选择 0

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

2 回答 2

2

没有看到堆栈跟踪很难知道,但无论如何我都会刺伤它。

当盒子仍然是空的时,您的函数的以下部分isEmpty()允许返回 false 。

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

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

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

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

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

希望有帮助。

于 2013-01-27T00:21:54.260 回答
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());
于 2013-01-27T00:22:35.650 回答