我在我们的测试设备中测试时遇到了EditText
和TextWatcher.
我们从未找到过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());
}
}
}
});
答案 0 :(得分:0)
您正试图在文本观察器内调用setText()
,这将产生无限循环。您可以使用标志变量来避免这种情况。
status
变量由defaut设置为false
。status
变量指示TextChange是由App本身还是由用户自己创建。如果是true
,则TextChange由App本身生成,反之亦然。试试这段代码。干杯! :)
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)