Follie
Follie

Reputation: 41

Text Change Listener with 2 EditText Fields

In my project I have 2 EditText fields with 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. But when I put this code in 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. 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.

Upvotes: 3

Views: 2168

Answers (3)

mehul rathod
mehul rathod

Reputation: 3

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

Upvotes: 0

Berť&#225;k
Berť&#225;k

Reputation: 7322

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. You must avoid getting into an infinite loop because of changing texts in 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:

private boolean keepChangingText = true;

Then update your TextWatchers like this:

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());

can fail, if you type some invalid text.

Upvotes: 4

Amitsharma
Amitsharma

Reputation: 1578

Try with this code this is setontouchListener on EditText simple code to do it

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");
}

Upvotes: 0

Related Questions