数値を入力すると、計算結果がテキスト フィールドに表示される小さなインターフェイスを作成しようとしています。同じインターフェイスでいくつかの操作を行います。だから私は通常の addtextchangedlistener を試してみましたが、動作しますが、動作させるにはリスナーを追加したすべての editText を埋める必要があることに気付きました。
これが私の最初のコードです:
package be.thebeps.easyconverter;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.*;
import android.text.*;
public class MainActivity extends Activity implements TextWatcher {
private Double calcula;
private EditText calcula1;
private TextView calcula2;
private Double calculb;
private EditText calculb1;
private TextView calculb2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
calcula1 = (EditText) findViewById(R.id.calcula1);
calcula1.addTextChangedListener(this);
calcula2 = (TextView) findViewById(R.id.calcula2);
calculb1 = (EditText) findViewById(R.id.calculb1);
calculb1.addTextChangedListener(this));
calculb2 = (TextView) findViewById(R.id.calculb2);
}
@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_main, menu);
return true;
}
@Override
public void afterTextChanged(Editable s) {
try {
calcula = Double.parseDouble(calcula1.getText().toString());
calcula = calcula*0.621;
calcula2.setText(String.format("%.3f", calcula));
calculb = Double.parseDouble(calculb1.getText().toString());
calculb = calculb*2.204;
calculb2.setText(String.format("%.2f", calculb));
} catch(NumberFormatException nfe) {
calcula2.setText(Integer.toString(0));
calculb2.setText(Integer.toString(0));
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int count, int after) {
}
}
次に、期待どおりに機能しなかったため、各 editText フィールドで textWatcher をインスタンス化するためのクラスを実装しようとしたため、実際のコードは次のとおりです。
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.*;
import android.text.*;
public class MainActivity extends Activity {
private Double calcula;
private EditText calcula1;
private TextView calcula2;
private Double calculb;
private EditText calculb1;
private TextView calculb2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
calcula1 = (EditText) findViewById(R.id.calcula1);
calcula1.addTextChangedListener(new CustomTextWatcher(calcula1));
calcula2 = (TextView) findViewById(R.id.calcula2);
calculb1 = (EditText) findViewById(R.id.calculb1);
calculb1.addTextChangedListener(new CustomTextWatcher(calculb1));
calculb2 = (TextView) findViewById(R.id.calculb2);
}
@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_main, menu);
return true;
}
private class CustomTextWatcher implements TextWatcher {
private EditText mEditText;
public CustomTextWatcher(EditText e) {
mEditText = e;
}
@Override
public void afterTextChanged(Editable s) {
try {
calcula = Double.parseDouble(calcula1.getText().toString());
calcula = calcula*1.451;
calcula2.setText(String.format("%.3f", calcula));
calculb = Double.parseDouble(calculb1.getText().toString());
calculb = calculb*3.206;
calculb2.setText(String.format("%.2f", calculb));
} catch(NumberFormatException nfe) {
calcula2.setText(Integer.toString(0));
calculb2.setText(Integer.toString(0));
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int count, int after) {
}
}
}
それでも、2 つのフィールドの 1 つだけが満たされている場合は、変更しても更新されません (aftertextchanged メソッドが呼び出されないことを意味します)。ビューを作成するときにすでに editText を埋めることを考えていましたが、それでも、誰かが 1 つの editText (たとえば、calcula1) に入り、それをクリアして (eg のバックスペースを使用)、calculb1 に入ると、彼は必要なすべての数値を入力できます。 calcub2 は変更されません。私はそれが難しいことを知っていますし、私はちょっと好き嫌いがありますが、誰かが私を助けてくれればうれしいです.