简体   繁体   English

具有2个EditText字段的文本更改侦听器

[英]Text Change Listener with 2 EditText Fields

In my project I have 2 EditText fields with Text Change Listener. 在我的项目中,我有2个EditText字段和Text Change Listener。

    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{

            }

        }
    });

When I put a number in Field1 it comes in Field2, that works fine. 当我在Field1中输入数字时,它就会出现在Field2中,效果很好。 But when I put this code in 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));
            }

And I put a number in Field2 the app crashes. 我在Field2中输入了一个数字,表示应用程序崩溃了。 Stacktrace: 堆栈跟踪:

31972-31972/arkstudioapps.textchangelistener E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: arkstudioapps.textchangelistener, PID: 31972
java.lang.StackOverflowError
        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$1.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$2.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$1.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$2.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$1.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$2.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$1.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$2.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$1.onTextChanged(MainActivity.java:38)
        at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
        at android.widget.TextView.setText(TextView.java:3816)
        at an

How can I fix this? 我怎样才能解决这个问题?

Thanks in advance. 提前致谢。

1. 1。

As you attempt to use TextWatcher on both EditTexts, it is generally not a good idea to change text in onTextChanged or in other TextWatcher's method. 当您尝试在两个EditText上使用TextWatcher时,通常不建议在onTextChanged或其他TextWatcher的方法中更改文本。 You must avoid getting into an infinite loop because of changing texts in EditTexts. 您必须避免由于更改EditTexts中的文本而陷入无限循环。

If you need to perform only one-time calculation and text update of the other field, when you type into one, try this: 如果您只需要执行一次计算和其他字段的文本更新,请在键入时进行以下尝试:

In your Activity, define a boolean variable which will control calling setText in TextWather's methods and which will prevent us from getting into infinite loop: 在您的Activity中,定义一个布尔变量,该变量将控制TextWather方法中对setText的调用,这将阻止我们进入无限循环:

private boolean keepChangingText = true;

Then update your TextWatchers like this: 然后像这样更新您的TextWatchers:

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. 2。

Double.valueOf(Field1.getText().toString());

can fail, if you type some invalid text . 如果您键入一些无效的文本 ,可能会失败。

Try with this code this is setontouchListener on EditText simple code to do it 尝试使用此代码,这是在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));

        }

    }
  }
});

Try this it may be helpful to you 试试这个可能对您有帮助

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM