0

edittext に数値を入力するとアプリが強制終了します。ボタンを押さずに値を入力すると、アプリが自動的に BMI を計算するようにしたい。

私は TextWatcher について何も知りませんが、調査してこのコードを思いつきました。しかし、それは機能していません。どうしたの?

public class BodyMassIndex extends Activity implements View.OnClickListener,
    TextWatcher {

double result;
EditText age, height, weight;
ToggleButton sex, cmin, kglb;
TextView tvResult;
double heightInt = 1;
double weightInt = 0;
int ageInt;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.bmi);
    initialize();

    sex.setOnClickListener(this);
    cmin.setOnClickListener(this);
    kglb.setOnClickListener(this);


}

private void initialize() {
    // TODO Auto-generated method stub

    age = (EditText) findViewById(R.id.etAge);
    height = (EditText) findViewById(R.id.etHeight);
    weight = (EditText) findViewById(R.id.etWeight);
    sex = (ToggleButton) findViewById(R.id.tbSex);
    cmin = (ToggleButton) findViewById(R.id.tbCMIN);
    kglb = (ToggleButton) findViewById(R.id.tbKGLB);
    tvResult = (TextView) findViewById(R.id.tvResult);
    age.addTextChangedListener(this);
    height.addTextChangedListener(this);
    weight.addTextChangedListener(this);
}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub

    switch (v.getId()) {
    case R.id.tbCMIN:
        heightInt = heightInt * 0.0254;
        break;
    case R.id.tbKGLB:
        weightInt = weightInt * 0.45359237;
        break;
    }

}

@Override
public void afterTextChanged(Editable s) {
    // TODO Auto-generated method stub
    calculate();
}

private void calculate() {
    // TODO Auto-generated method stub
     Editable H = height.getText(), W = weight.getText();

    if(H != null)
        heightInt = Double.parseDouble(H.toString());
    if (W != null)
        weightInt = Double.parseDouble(W.toString());

    result = weightInt / (heightInt * heightInt);
    String textResult = "Your BMI is " + result;
    tvResult.setText(textResult);
}

@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

    }
}

'

4

2 に答える 2

1

http://developer.android.com/reference/android/text/TextWatcher.htmlからafterTextChanged メソッドについて: "but be careful not to get yourself into an infinite loop, because any changes you make will cause this method to be called again recursively....you can use setSpan(Object, int, int, int) in onTextChanged(CharSequence, int, int, int) "

于 2013-08-06T02:37:50.927 に答える
0

あなたはすでに持っています:

 height = (EditText) findViewById(R.id.etHeight);
    weight = (EditText) findViewById(R.id.etWeight);

calculate() メソッドのみを変更します。

private void calculate()
{
//remove the Editable thing declaration...
heightInt = Double.parseDouble(height.getText().toString());
wightInt = Double.parseDouble(weight.getText().toString());
result = weightInt / (heightInt * heightInt);
String textResult = "Your BMI is " + result;
tvResult.setText(textResult);

}

PS: ここでは、EditText には数字のみが含まれ、文字は含まれないと想定しています。手紙はアプリを強制的に閉じます。そのため、それを確認する必要があります。

于 2013-08-06T02:33:05.037 に答える