如何在android中使用Textwatcher更新两个Edittext Parraley?

如何在android中使用Textwatcher更新两个Edittext Parraley?,android,android-edittext,keylistener,textwatcher,Android,Android Edittext,Keylistener,Textwatcher,您好,我面临一个多编辑文本并行更新的问题。如果我在第一个编辑文本中输入值,第二个编辑文本将更改。在第二个编辑文本中也是如此。但编辑文本中光标的键侦听器存在问题。我无法获取光标。如何解决此问题?我不知道您正在做(或试图做)什么。 在onTextChangedfortext1中,您正在触发onTextChangedfortext2。这里似乎触发了无限文本更改侦听器。 正在发生的事情的逻辑-> 假设用户将字符1输入text1总计现在为2。现在您将text2设置为total,即2。这反过来会触发text

您好,我面临一个多编辑文本并行更新的问题。如果我在第一个编辑文本中输入值,第二个编辑文本将更改。在第二个编辑文本中也是如此。但编辑文本中光标的键侦听器存在问题。我无法获取光标。如何解决此问题?

我不知道您正在做(或试图做)什么。
onTextChanged
for
text1
中,您正在触发
onTextChanged
for
text2
。这里似乎触发了无限文本更改侦听器。
正在发生的事情的逻辑->
假设用户将字符
1
输入
text1
<代码>总计现在为
2
。现在您将
text2
设置为
total
,即
2
。这反过来会触发
text2
的文本更改侦听器。现在
total
2
+2=
4
。现在将
4
设置为
text1
的文本。这反过来会触发
text1
的文本更改侦听器
对我来说似乎是一个永无止境的循环。这就是你得到一个
StackOverflow
错误(lol)的原因。你到底想做什么

我不太确定是什么解决了这个问题(我手头没有Android Studio的工作副本),但将块移动到
PostTextChanged
可能会解决这个问题。


你可以这样试试。TextWatcher将通过处理程序通过方法afterTextChanged将值更新为second EditText

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


    }


    }
处理程序将用于更新second EditText中的文本

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

这将给出我想要的解决方案。光标在每个edittext中移动时,我会得到值。

当第一个edittext处于有效模式时,删除另一个edittext的TextChangeListener,并在文本更改后添加它

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

你的意思是光标没有更新是的,你是对的,我得到了stackoverflow错误。
 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);
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);**

            }
        });


    }


    }