带有 2 个 EditText 字段的文本更改侦听器
Text Change Listener with 2 EditText Fields
在我的项目中,我有 2 个带有文本更改侦听器的 EditText 字段。
final EditText Field1 = (EditText) findViewById(R.id.Field1);
final EditText Field2 = (EditText) findViewById(R.id.Field2);
Field1.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
if(Field1.getText().toString().equals("")){
}
else{
double number1 = Double.valueOf(Field1.getText().toString());
double number2 = Math.round((number1 * 10) / 25);
Field2.setText(String.valueOf(number2));
}
}
});
Field2.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
if(Field2.getText().toString().equals("")){
}
else{
}
}
});
当我在 Field1 中输入数字时,它会出现在 Field2 中,效果很好。但是当我把这段代码放在 Field2 中时:
if(Field2.getText().toString().equals("")){
}
else{
double number2 = Double.valueOf(Field2.getText().toString());
double number1 = Math.round((number2 * 20) / 35);
Field1.setText(String.valueOf(number1));
}
然后我在 Field2 中输入了一个数字,应用程序崩溃了。
堆栈跟踪:
31972-31972/arkstudioapps.textchangelistener E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: arkstudioapps.textchangelistener, PID: 31972
java.lang.WhosebugError
at android.text.MeasuredText.addStyleRun(MeasuredText.java:164)
at android.text.MeasuredText.addStyleRun(MeasuredText.java:204)
at android.text.StaticLayout.generate(StaticLayout.java:281)
at android.text.DynamicLayout.reflow(DynamicLayout.java:284)
at android.text.DynamicLayout.<init>(DynamicLayout.java:170)
at android.widget.TextView.makeSingleLayout(TextView.java:6134)
at android.widget.TextView.makeNewLayout(TextView.java:6032)
at android.widget.TextView.checkForRelayout(TextView.java:6571)
at android.widget.TextView.setText(TextView.java:3813)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3646)
at arkstudioapps.textchangelistener.MainActivity.onTextChanged(MainActivity.java:38)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.setText(TextView.java:3816)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3646)
at arkstudioapps.textchangelistener.MainActivity.onTextChanged(MainActivity.java:62)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.setText(TextView.java:3816)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3646)
at arkstudioapps.textchangelistener.MainActivity.onTextChanged(MainActivity.java:38)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.setText(TextView.java:3816)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3646)
at arkstudioapps.textchangelistener.MainActivity.onTextChanged(MainActivity.java:62)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.setText(TextView.java:3816)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3646)
at arkstudioapps.textchangelistener.MainActivity.onTextChanged(MainActivity.java:38)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.setText(TextView.java:3816)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3646)
at arkstudioapps.textchangelistener.MainActivity.onTextChanged(MainActivity.java:62)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.setText(TextView.java:3816)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3646)
at arkstudioapps.textchangelistener.MainActivity.onTextChanged(MainActivity.java:38)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.setText(TextView.java:3816)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3646)
at arkstudioapps.textchangelistener.MainActivity.onTextChanged(MainActivity.java:62)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.setText(TextView.java:3816)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3646)
at arkstudioapps.textchangelistener.MainActivity.onTextChanged(MainActivity.java:38)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.setText(TextView.java:3816)
at an
我该如何解决这个问题?
提前致谢。
1.
当您尝试在两个 EditText 上使用 TextWatcher 时,在 onTextChanged 或其他 TextWatcher 方法中更改文本通常不是一个好主意。 您必须避免因为更改 EditTexts 中的文本而陷入无限循环。
如果您只需要执行一次计算和另一个字段的文本更新,当您输入一个字段时,试试这个:
在您的 Activity 中,定义一个布尔变量,它将控制在 TextWather 的方法中调用 setText 并防止我们进入无限循环:
private boolean keepChangingText = true;
然后像这样更新您的 TextWatcher:
Field1.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
if (Field1.getText().toString().equals("")) {
}
else {
double number1 = Double.valueOf(Field1.getText().toString());
double number2 = Math.round((number1 * 10) / 25);
if (keepChangingText) {
keepChangingText = false;
Field2.setText(String.valueOf(number2));
} else {
keepChangingText = true;
}
}
}
});
Field2.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
if (Field2.getText().toString().equals("")) {
}
else {
double number2 = Double.valueOf(Field2.getText().toString());
double number1 = Math.round((number2 * 20) / 35);
if (keepChangingText) {
keepChangingText = false;
Field1.setText(String.valueOf(number1));
} else {
keepChangingText = true;
}
}
}
});
2.
Double.valueOf(Field1.getText().toString());
可能会失败,如果您键入一些无效文本。
尝试使用此代码,这是 EditText 上的 setontouchListener 简单代码即可完成
EditText edtName,edtAddress;
TextView tvaData;
editTextName.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
ChangeText();
return false;
}
});
edtAddress.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
ChangeText();
return false;
}
});
private void ChangeText{
tvaData.setText("Abc");
}
final EditText Field1 = (EditText) findViewById(R.id.Field1);
final EditText Field2 = (EditText) findViewById(R.id.Field2);
Field1.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
if (getCurrentFocus() == Field1)
{
if(Field1.getText().toString().equals("")){
}
else{
double number1 = Double.valueOf(Field1.getText().toString());
double number2 = Math.round((number1 * 10) / 25);
Field2.setText(String.valueOf(number2));
}
}
}
});
Field2.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
if (getCurrentFocus() == Field2)
{
if(Field2.getText().toString().equals("")){
}
else{
double number2 = Double.valueOf(Field2.getText().toString());
double number1 = Math.round((number2 * 20) / 35);
Field1.setText(String.valueOf(number1));
}
}
}
});
试试这个可能对你有帮助
在我的项目中,我有 2 个带有文本更改侦听器的 EditText 字段。
final EditText Field1 = (EditText) findViewById(R.id.Field1);
final EditText Field2 = (EditText) findViewById(R.id.Field2);
Field1.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
if(Field1.getText().toString().equals("")){
}
else{
double number1 = Double.valueOf(Field1.getText().toString());
double number2 = Math.round((number1 * 10) / 25);
Field2.setText(String.valueOf(number2));
}
}
});
Field2.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
if(Field2.getText().toString().equals("")){
}
else{
}
}
});
当我在 Field1 中输入数字时,它会出现在 Field2 中,效果很好。但是当我把这段代码放在 Field2 中时:
if(Field2.getText().toString().equals("")){
}
else{
double number2 = Double.valueOf(Field2.getText().toString());
double number1 = Math.round((number2 * 20) / 35);
Field1.setText(String.valueOf(number1));
}
然后我在 Field2 中输入了一个数字,应用程序崩溃了。 堆栈跟踪:
31972-31972/arkstudioapps.textchangelistener E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: arkstudioapps.textchangelistener, PID: 31972
java.lang.WhosebugError
at android.text.MeasuredText.addStyleRun(MeasuredText.java:164)
at android.text.MeasuredText.addStyleRun(MeasuredText.java:204)
at android.text.StaticLayout.generate(StaticLayout.java:281)
at android.text.DynamicLayout.reflow(DynamicLayout.java:284)
at android.text.DynamicLayout.<init>(DynamicLayout.java:170)
at android.widget.TextView.makeSingleLayout(TextView.java:6134)
at android.widget.TextView.makeNewLayout(TextView.java:6032)
at android.widget.TextView.checkForRelayout(TextView.java:6571)
at android.widget.TextView.setText(TextView.java:3813)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3646)
at arkstudioapps.textchangelistener.MainActivity.onTextChanged(MainActivity.java:38)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.setText(TextView.java:3816)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3646)
at arkstudioapps.textchangelistener.MainActivity.onTextChanged(MainActivity.java:62)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.setText(TextView.java:3816)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3646)
at arkstudioapps.textchangelistener.MainActivity.onTextChanged(MainActivity.java:38)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.setText(TextView.java:3816)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3646)
at arkstudioapps.textchangelistener.MainActivity.onTextChanged(MainActivity.java:62)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.setText(TextView.java:3816)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3646)
at arkstudioapps.textchangelistener.MainActivity.onTextChanged(MainActivity.java:38)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.setText(TextView.java:3816)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3646)
at arkstudioapps.textchangelistener.MainActivity.onTextChanged(MainActivity.java:62)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.setText(TextView.java:3816)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3646)
at arkstudioapps.textchangelistener.MainActivity.onTextChanged(MainActivity.java:38)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.setText(TextView.java:3816)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3646)
at arkstudioapps.textchangelistener.MainActivity.onTextChanged(MainActivity.java:62)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.setText(TextView.java:3816)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3646)
at arkstudioapps.textchangelistener.MainActivity.onTextChanged(MainActivity.java:38)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.setText(TextView.java:3816)
at an
我该如何解决这个问题?
提前致谢。
1.
当您尝试在两个 EditText 上使用 TextWatcher 时,在 onTextChanged 或其他 TextWatcher 方法中更改文本通常不是一个好主意。 您必须避免因为更改 EditTexts 中的文本而陷入无限循环。
如果您只需要执行一次计算和另一个字段的文本更新,当您输入一个字段时,试试这个:
在您的 Activity 中,定义一个布尔变量,它将控制在 TextWather 的方法中调用 setText 并防止我们进入无限循环:
private boolean keepChangingText = true;
然后像这样更新您的 TextWatcher:
Field1.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
if (Field1.getText().toString().equals("")) {
}
else {
double number1 = Double.valueOf(Field1.getText().toString());
double number2 = Math.round((number1 * 10) / 25);
if (keepChangingText) {
keepChangingText = false;
Field2.setText(String.valueOf(number2));
} else {
keepChangingText = true;
}
}
}
});
Field2.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
if (Field2.getText().toString().equals("")) {
}
else {
double number2 = Double.valueOf(Field2.getText().toString());
double number1 = Math.round((number2 * 20) / 35);
if (keepChangingText) {
keepChangingText = false;
Field1.setText(String.valueOf(number1));
} else {
keepChangingText = true;
}
}
}
});
2.
Double.valueOf(Field1.getText().toString());
可能会失败,如果您键入一些无效文本。
尝试使用此代码,这是 EditText 上的 setontouchListener 简单代码即可完成
EditText edtName,edtAddress;
TextView tvaData;
editTextName.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
ChangeText();
return false;
}
});
edtAddress.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
ChangeText();
return false;
}
});
private void ChangeText{
tvaData.setText("Abc");
}
final EditText Field1 = (EditText) findViewById(R.id.Field1);
final EditText Field2 = (EditText) findViewById(R.id.Field2);
Field1.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
if (getCurrentFocus() == Field1)
{
if(Field1.getText().toString().equals("")){
}
else{
double number1 = Double.valueOf(Field1.getText().toString());
double number2 = Math.round((number1 * 10) / 25);
Field2.setText(String.valueOf(number2));
}
}
}
});
Field2.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
if (getCurrentFocus() == Field2)
{
if(Field2.getText().toString().equals("")){
}
else{
double number2 = Double.valueOf(Field2.getText().toString());
double number1 = Math.round((number2 * 20) / 35);
Field1.setText(String.valueOf(number1));
}
}
}
});
试试这个可能对你有帮助