Android 使用Textwatcher时出现堆栈溢出错误

Android 使用Textwatcher时出现堆栈溢出错误,android,Android,我有三个Edittext。当我更改first Edittext值时,第三个Edittext值将由Textwatcher更改。当我更改第三个Edittext时,第一个Edittext值将由Textwatcher更改。当我运行代码时,应用程序正在崩溃 这是我的密码 qty = (EditText) findViewById(R.id.qty); rate = (EditText) findViewById(R.id.rate); amount = (EditText) findVi

我有三个Edittext。当我更改first Edittext值时,第三个Edittext值将由Textwatcher更改。当我更改第三个Edittext时,第一个Edittext值将由Textwatcher更改。当我运行代码时,应用程序正在崩溃

这是我的密码

   qty = (EditText) findViewById(R.id.qty);
   rate = (EditText) findViewById(R.id.rate);
   amount = (EditText) findViewById(R.id.amount);

   qty.addTextChangedListener(new TextWatcher() {
       @Override
       public void onTextChanged(CharSequence s, int start, int before, int count) { 
           // 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 afterTextChanged(Editable s) {
           // TODO Auto-generated method stub
           String qtyvalue = qty.getText().toString();
           String ratevalue = rate.getText().toString();

           if (qtyvalue.equals("") || ratevalue.equals("")) {
               val1 = 0d;
               val2 = 0d;
           } else {
               val1 = Double.parseDouble(qtyvalue);
               val2 = Double.parseDouble(ratevalue);
           }

           amount.setText(Double.toString(val1 * val2));
       }
   });

   amount.addTextChangedListener(new TextWatcher() {
       @Override
       public void onTextChanged(CharSequence s, int start, int before, int count) {
           // 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 afterTextChanged(Editable s) {
           // TODO Auto-generated method stub
           String amountvalue = amount.getText().toString();
           String ratevalue = rate.getText().toString();

           if (amountvalue.equals("") || ratevalue.equals("")) {
               val3 = 0d;
               val4 = 0d;
            } else {
               val3 = Double.parseDouble(amountvalue);
               val4 = Double.parseDouble(ratevalue);
            }

            System.out.println(Double.toString((double)val3/val4));    
            qty.setText(Double.toString((double)val3/val4));
        }
    });
Logcat

 java.lang.StackOverflowError
            at android.text.method.ReplacementTransformationMethod$ReplacementCharSequence.getChars(ReplacementTransformationMethod.java:151)
            at android.text.TextUtils.getChars(TextUtils.java:78)
            at android.text.TextUtils.indexOf(TextUtils.java:111)
            at android.text.StaticLayout.generate(StaticLayout.java:209)
            at android.text.DynamicLayout.reflow(DynamicLayout.java:324)
            at android.text.DynamicLayout.<init>(DynamicLayout.java:174)
            at android.widget.TextView.makeSingleLayout(TextView.java:6964)
            at android.widget.TextView.makeNewLayout(TextView.java:6813)
            at android.widget.TextView.checkForRelayout(TextView.java:7409)
            at android.widget.TextView.setText(TextView.java:4300)
            at android.widget.TextView.setText(TextView.java:4137)
            at android.widget.EditText.setText(EditText.java:104)
            at android.widget.TextView.setText(TextView.java:4112)
            at com.example.admin.foms.Delivery$1.afterTextChanged(Delivery.java:93)
            at android.widget.TextView.sendAfterTextChanged(TextView.java:8293)
            at android.widget.TextView.setText(TextView.java:4307)
            at android.widget.TextView.setText(TextView.java:4137)
            at android.widget.EditText.setText(EditText.java:104)
            at android.widget.TextView.setText(TextView.java:4112)
            at com.example.admin.foms.Delivery$2.afterTextChanged(Delivery.java:127)
            at android.widget.TextView.sendAfterTextChanged(TextView.java:8293)
            at android.widget.TextView.setText(TextView.java:4307)
            at android.widget.TextView.setText(TextView.java:4137)
            at android.widget.EditText.setText(EditText.java:104)
            at android.widget.TextView.setText(TextView.java:4112)
            at com.example.admin.foms.Delivery$1.afterTextChanged(Delivery.java:93)
            at android.widget.TextView.sendAfterTextChanged(TextView.java:8293)
            at android.widget.TextView.setText(TextView.java:4307)
            at android.widget.TextView.setText(TextView.java:4137)
            at android.widget.EditText.setText(EditText.java:104)
            at android.widget.TextView.setText(TextView.java:4112)
            at com.example.admin.foms.Delivery$2.afterTextChanged(Delivery.java:127)
            at android.widget.TextView.sendAfterTextChanged(TextView.java:8293)
            at android.widget.TextView.setText(TextView.java:4307)
            at android.widget.TextView.setText(TextView.java:4137)
            at android.widget.EditText.setText(EditText.java:104)
            at android.widget.TextView.setText(TextView.java:4112)
            at com.example.admin.foms.Delivery$1.afterTextChanged(Delivery.java:93)
            at android.widget.TextView.sendAfterTextChanged(TextView.java:8293)
            at android.widget.TextView.setText(TextView.java:4307)
            at android.widget.TextView.setText(TextView.java:4137)
            at android.widget.EditText.setText(EditText.java:104)
            at android.widget.TextView.setText(TextView.java:4112)
            at com.example.admin.foms.Delivery$2.afterTextChanged(Delivery.java:127)
            at android.widget.TextView.sendAfterTextChanged(TextView.java:8293)
            at android.widget.TextView.setText(TextView.java:4307)
            at android.widget.TextView.setText(TextView.java:4137)
            at android.widget.EditText.setText(EditText.java:104)
            at android.widget.TextView.setText(TextView.java:4112)
            at com.example.admin.foms.Delivery$1.afterTextChanged(Delivery.java:93)
            at android.widget.TextView.sendAfterTextChanged(TextView.java:8293)
            at android.widget.TextView.setText(TextView.java:4307)
            at android.widget.TextView.setText(TextView.java:4137)
            at android.widget.EditText.setText(EditText.java:104)
            at android.widget.TextView.setText(TextView.java:4112)
            at com.example.admin.foms.Delivery$2.afterTextChanged(Delivery.java:127)
            at android.widget.TextView.sendAfterTextChanged(TextView.java:8293)
            at android.widget.TextView.setText(TextView.java:4307)
            at android.widget.TextView.setText(TextView.java:4137)
            at android.widget.EditText.setText(EditText.java:104)
            at android.widget.TextView.setText(TextView.java:4112)
            at com.example.admin.foms.Delivery$1.afterTextChanged(Delivery.java:93)
            at android.widget.TextView.sendAfterTextChanged(TextView.java:8293)
            at android.widget.TextView.setText(TextView.java:4307)
            at android.widget.TextView.setText(TextView
java.lang.StackOverflower错误
位于android.text.method.ReplacementTransformationMethod$ReplacementCharSequence.getChars(ReplacementTransformationMethod.java:151)
位于android.text.TextUtils.getChars(TextUtils.java:78)
位于android.text.TextUtils.indexOf(TextUtils.java:111)
位于android.text.StaticLayout.generate(StaticLayout.java:209)
在android.text.dynamiclayot.reflow(dynamiclayot.java:324)
位于android.text.DynamicLayout.(DynamicLayout.java:174)
在android.widget.TextView.makeSingleLayout上(TextView.java:6964)
位于android.widget.TextView.makeNewLayout(TextView.java:6813)
在android.widget.TextView.checkForRelayout(TextView.java:7409)中
位于android.widget.TextView.setText(TextView.java:4300)
位于android.widget.TextView.setText(TextView.java:4137)
位于android.widget.EditText.setText(EditText.java:104)
位于android.widget.TextView.setText(TextView.java:4112)
位于com.example.admin.foms.Delivery$1.afterTextChanged(Delivery.java:93)
在android.widget.TextView.sendAfterTextChanged上(TextView.java:8293)
位于android.widget.TextView.setText(TextView.java:4307)
位于android.widget.TextView.setText(TextView.java:4137)
位于android.widget.EditText.setText(EditText.java:104)
位于android.widget.TextView.setText(TextView.java:4112)
位于com.example.admin.foms.Delivery$2.afterTextChanged(Delivery.java:127)
在android.widget.TextView.sendAfterTextChanged上(TextView.java:8293)
位于android.widget.TextView.setText(TextView.java:4307)
位于android.widget.TextView.setText(TextView.java:4137)
位于android.widget.EditText.setText(EditText.java:104)
位于android.widget.TextView.setText(TextView.java:4112)
位于com.example.admin.foms.Delivery$1.afterTextChanged(Delivery.java:93)
在android.widget.TextView.sendAfterTextChanged上(TextView.java:8293)
位于android.widget.TextView.setText(TextView.java:4307)
位于android.widget.TextView.setText(TextView.java:4137)
位于android.widget.EditText.setText(EditText.java:104)
位于android.widget.TextView.setText(TextView.java:4112)
位于com.example.admin.foms.Delivery$2.afterTextChanged(Delivery.java:127)
在android.widget.TextView.sendAfterTextChanged上(TextView.java:8293)
位于android.widget.TextView.setText(TextView.java:4307)
位于android.widget.TextView.setText(TextView.java:4137)
位于android.widget.EditText.setText(EditText.java:104)
位于android.widget.TextView.setText(TextView.java:4112)
位于com.example.admin.foms.Delivery$1.afterTextChanged(Delivery.java:93)
在android.widget.TextView.sendAfterTextChanged上(TextView.java:8293)
位于android.widget.TextView.setText(TextView.java:4307)
位于android.widget.TextView.setText(TextView.java:4137)
位于android.widget.EditText.setText(EditText.java:104)
位于android.widget.TextView.setText(TextView.java:4112)
位于com.example.admin.foms.Delivery$2.afterTextChanged(Delivery.java:127)
在android.widget.TextView.sendAfterTextChanged上(TextView.java:8293)
位于android.widget.TextView.setText(TextView.java:4307)
位于android.widget.TextView.setText(TextView.java:4137)
位于android.widget.EditText.setText(EditText.java:104)
位于android.widget.TextView.setText(TextView.java:4112)
位于com.example.admin.foms.Delivery$1.afterTextChanged(Delivery.java:93)
在android.widget.TextView.sendAfterTextChanged上(TextView.java:8293)
位于android.widget.TextView.setText(TextView.java:4307)
位于android.widget.TextView.setText(TextView.java:4137)
位于android.widget.EditText.setText(EditText.java:104)
位于android.widget.TextView.setText(TextView.java:4112)
位于com.example.admin.foms.Delivery$2.afterTextChanged(Delivery.java:127)
在android.widget.TextView.sendAfterTextChanged上(TextView.java:8293)
位于android.widget.TextView.setText(TextView.java:4307)
位于android.widget.TextView.setText(TextView.java:4137)
位于android.widget.EditText.setText(EditText.java:104)
位于android.widget.TextView.setText(TextView.java:4112)
位于com.example.admin.foms.Delivery$1.afterTextChanged(Delivery.java:93)
在android.widget.TextView.sendAfterTextChanged上(TextView.java:8293)
位于android.widget.TextView.setText(TextView.java:4307)
在android.widget.TextView.setText(TextView

您已经在
编辑文本
数量
金额
)上设置了
文本观察者
,并且您正在
文本更改
上设置备用
编辑文本


在更改
amount
EditText
中的文本后,它将更改
amount
EditText
中的值(由于
TextWatcher
),现在
amount
值已更改,因此它将再次尝试更改
amount EditText
的值(由于
TextWatcher
)然后过程继续。在文本查看器的最后一行出现堆栈溢出错误,将当前文本与要设置的文本进行比较。如果它们相等,则不要设置文本。这将避免无休止的循环。

您可以执行以下操作:

        // temporary disable the listener
        edt.removeTextChangedListener(this);
        // change the text
        edt.setText("Some text");
        // enable it again
        edt.addTextChangedListener(this);
根据,为了避免在更改文本时出现递归,可以将flag设置为
posterextch
 boolean preventUpdate = false;

   @Override
   public void afterTextChanged(Editable s) {
      if(preventUpdate){
         preventUpdate = false; // reset flag after calling
         return;
      }

     // your logic 

        // prevent update after change value
        preventUpdate = true;   
        qty.setText(Double.toString((double)val3/val4));
   }
qty.addTextChangedListener(new TextWatcher() {
    ...
    @Override
    public void afterTextChanged(Editable s) {
        if (qty.getText().toString().equals(s.toString())){return;}
        ...
    }
};