EditText aftertextchanged抛出StackOverflowError

时间:2016-03-01 06:38:25

标签: android android-edittext textwatcher

我在我们的测试设备中测试时遇到了EditTextTextWatcher.我们从未找到过StackOverflowError,但是一旦我们在Google Play商店中发布了应用,我们就会收到某些用户的StackOverflowError问题。为什么会发生这种情况,我会通过一些链接但没有得到完美答案。是否需要在我的代码中完成任何事情。

我的代码的骨架:

weightEditText.addTextChangedListener(new TextWatcher() 
        {           
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count){
            }           
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
                m_currentWeight = weightEditText.getText().toString();              
            }           
            @Override
            public void afterTextChanged(Editable s)
            {
                if(!weightEditText.getText().toString().equals("")) {
                    Pattern mPattern = Pattern.compile("^([1-9][0-9]{0,2}(\\.[0-9]{0,2}?)?)?$");

                    Matcher matcher = mPattern.matcher(s.toString());
                    if (!matcher.find()) {
                        weightEditText.setText(m_currentWeight);
                        weightEditText.setSelection(weightEditText.getText().length());
                    }
                }
            }
        }); 

2 个答案:

答案 0 :(得分:0)

您正试图在文本观察器内调用setText(),这将产生无限循环。您可以使用标志变量来避免这种情况。

  1. status变量由defaut设置为false
  2. status变量指示TextChange是由App本身还是由用户自己创建。如果是true,则TextChange由App本身生成,反之亦然。
  3. 试试这段代码。干杯! :)

    public class MainActivity extends AppCompatActivity {
     boolean status=false;//global variable
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            weightEditText.addTextChangedListener(new TextWatcher() 
                {           
                    @Override
                    public void onTextChanged(CharSequence s, int start, int before, int count){
                    }           
                    @Override
                    public void beforeTextChanged(CharSequence s, int start, int count,
                            int after) {
                        m_currentWeight = weightEditText.getText().toString();              
                    }           
                    @Override
                    public void afterTextChanged(Editable s)
                    {
                        if(status){
                        status=false;
                         return;
                         }else{
                          status=true;
                          if(!weightEditText.getText().toString().equals("")) {
                            Pattern mPattern = Pattern.compile("^([1-9][0-9]{0,2}(\\.[0-9]{0,2}?)?)?$");
    
                            Matcher matcher = mPattern.matcher(s.toString());
                            if (!matcher.find()) {
                                weightEditText.setText(m_currentWeight);
                                weightEditText.setSelection(weightEditText.getText().length());
                            }
                        }
                        }
                    }
                }); 
        }
    }
    

答案 1 :(得分:0)

为了避免递归,您需要在设置文本之前取消注册textWatcher,然后重新注册它。

在addTextChangedListener(...)方法之外声明TextWatcher。然后你可以做weightEditText.removeTextChangedListener(mWatcher)和weightEditText.addTextChangedListener(mWatcher)