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 に答える