rajeshlawrance
rajeshlawrance

Reputation: 559

How to update the two Edittext parralley using Textwatcher in android?

public class SampleActivity extends Activity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_datepicker);


        final EditText text1 = (EditText) findViewById(R.id.text1);
        final EditText text2 = (EditText) findViewById(R.id.text2);


        text1.addTextChangedListener(new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

                try {
                    int total = Integer.parseInt(s.toString()) + 1;
                    text2.setText(String.valueOf(total));
                }catch (Exception e){
                    e.printStackTrace();
                }


            }
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
            @Override
            public void afterTextChanged(Editable s) {
            }
        });

        text2.addTextChangedListener(new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                try {
                    int total = Integer.parseInt(s.toString()) + 2;
                    text1.setText(String.valueOf(total));
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            public void afterTextChanged(Editable s) {
            }
        });


    }


    }

Hi I am facing one problem with multiple edit text updating parallel.If i enter value in first edit-text, the second edit text changed.Same in second edittext. But the key listener of cursor in edit-text has problem. i am unable to get the cursor.How to solve this problem?

Upvotes: 1

Views: 2079

Answers (4)

Prasanna Anbazhagan
Prasanna Anbazhagan

Reputation: 1725

Remove TextChangeListener of another EditText when first one is in effective mode and add that after text change..

public class SampleActivity extends Activity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_datepicker);


        final EditText text1 = (EditText) findViewById(R.id.text1);
        final EditText text2 = (EditText) findViewById(R.id.text2);


        text1.addTextChangedListener(new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
    **text2.addTextChangedListener(null);**
                try {
                    int total = Integer.parseInt(s.toString()) + 1;
                    text2.setText(String.valueOf(total));
                }catch (Exception e){
                    e.printStackTrace();
                }


            }
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
            @Override
            public void afterTextChanged(Editable s) {
    **text2.addTextChangedListener(this);**
            }
        });

        text2.addTextChangedListener(new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) 
{
                    text1.addTextChangedListener(null);
                try {
                    int total = Integer.parseInt(s.toString()) + 2;
                    text1.setText(String.valueOf(total));
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            public void afterTextChanged(Editable s) 
{
                **text1.addTextChangedListener(this);**

            }
        });


    }


    }

Upvotes: 0

rajeshlawrance
rajeshlawrance

Reputation: 559

 includeTW = new TextWatcher(){

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

            }

            @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) {
                if(!(includedText.getText().toString().equals("")))
                {
                    excludedText.removeTextChangedListener(excludeTW);
                    String included = includedText.getText().toString();
                    excludedText.setText(included); //////// Error Line
                    excludedText.addTextChangedListener(excludeTW);
                }

            }



        };


        excludeTW = new TextWatcher(){

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

            }

            @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) {
                if(!(excludedText.getText().toString().equals(""))) {
                    includedText.removeTextChangedListener(includeTW);
                    String excluded = excludedText.getText().toString();
                    includedText.setText(excluded);
                    includedText.addTextChangedListener(includeTW);
                }

            }



        };
        includedText.addTextChangedListener(includeTW) ;
        excludedText.addTextChangedListener(excludeTW);

This will give the solution exactly what i want.I am getting the value with the cursor moving in each edittext.

Upvotes: 0

Sreehari
Sreehari

Reputation: 5655


You can try this way. TextWatcher will update the values to second EditText through Handler through the method afterTextChanged.

 EditText text1;
 StringBuffer previousChar=new StringBuffer();

        @Override
        protected void onCreate(Bundle savedInstanceState) {
        setContentView(R.layout.activity_main);
        text1=(EditText)findViewById(R.id.editText);
        text1.addTextChangedListener(new TextWatcher() {
                    @Override
                    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                    }
                    @Override
                    public void onTextChanged(CharSequence s, int start, int before, int count) {
                    }
                    @Override
                    public void afterTextChanged(Editable s) {
                        if(!previousChar.toString().equals(s.toString())){
                            Message msg=new Message();
                            msg.obj=s.toString();
                            localHandler.sendMessage(msg);
                            previousChar=new StringBuffer(s.toString());
                            Log.i("TAG", "TextEntered = "+s);
                        }
                    }
                });}

The handler will be used to update the text in second EditText

private Handler localHandler = new Handler(){
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            String value=(String)msg.obj;
            text2.setText(value);
        }
    };

Upvotes: 1

Abhishek Dabholkar
Abhishek Dabholkar

Reputation: 61

I don't get what you are doing (or trying to do).
In the onTextChanged for text1 you are triggering the onTextChanged for text2. Seems like infinite text change listeners being triggered here.
The logic for what is happening ->
Suppose the user types in the character 1 into text1. total is now 2. Now you set text2 as total which is 2. This in turn triggers the Text Change Listener for text2. Now total is 2+2=4. You now set 4 as the text for text1. This in turn triggers the Text Change Listener for text1.
Seems like a never ending infinite loop to me. This is the reason you are getting a StackOverflowError (lol) What did you actually want to do?

Not really sure about what might solve that problem (I don't have a working copy of Android Studio at hand), but moving the block to afterTextChanged might do it.

Upvotes: 1

Related Questions