I have an EditText with a date mask. And when you call the listener, the application crashes.

Arraylist ad for EditText s:

 ArrayList<EditText> ListDocumentExpiry = new ArrayList<>(); 

In the loop:

 ListBirthDate.get(i).addTextChangedListener(Mask.insert("##.##.####", ListBirthDate.get(i))); 

Mask class:

 public abstract class Mask { public static String unmask(String s) { return s.replaceAll("[.]", "").replaceAll("[-]", "") .replaceAll("[/]", "").replaceAll("[(]", "") .replaceAll("[)]", ""); } public static TextWatcher insert(final String mask, final EditText ediTxt) { return new TextWatcher() { boolean isUpdating; String old = ""; public void onTextChanged(CharSequence s, int start, int before,int count) { String str = Mask.unmask(s.toString()); String mascara = ""; if (isUpdating) { old = str; isUpdating = false; return; } int i = 0; for (char m : mask.toCharArray()) { if (m != '#' && str.length() > old.length()) { mascara += m; continue; } try { mascara += str.charAt(i); } catch (Exception e) { break; } i++; } isUpdating = true; ediTxt.setText(mascara); ediTxt.setSelection(mascara.length()); } public void beforeTextChanged(CharSequence s, int start, int count, int after) {} public void afterTextChanged(Editable s) { ediTxt.setError(null); } }; } } 

Here is the error itself:

 FATAL EXCEPTION: main java.lang.StackOverflowError at android.text.SpannableStringBuilder.checkRange(SpannableStringBuilder.java:1013) at android.text.SpannableStringBuilder.getChars(SpannableStringBuilder.java:913) at android.text.TextUtils.getChars(TextUtils.java:70) at android.text.method.ReplacementTransformationMethod$ReplacementCharSequence.getChars(ReplacementTransformationMethod.java:151) at android.text.TextUtils.getChars(TextUtils.java:70) at android.text.TextUtils.indexOf(TextUtils.java:103) at android.text.StaticLayout.generate(StaticLayout.java:182) at android.text.DynamicLayout.reflow(DynamicLayout.java:284) at android.text.DynamicLayout.<init>(DynamicLayout.java:170) at android.widget.TextView.makeSingleLayout(TextView.java:5843) at android.widget.TextView.makeNewLayout(TextView.java:5741) at android.widget.TextView.checkForRelayout(TextView.java:6280) at android.widget.TextView.setText(TextView.java:3547) at android.widget.TextView.setText(TextView.java:3405) at android.widget.EditText.setText(EditText.java:80) at android.widget.TextView.setText(TextView.java:3380) at kz.tem_tour.Booking.Mask$1.onTextChanged(Mask.java:40) at android.widget.TextView.sendOnTextChanged(TextView.java:7079) at android.widget.TextView.setText(TextView.java:3550) at android.widget.TextView.setText(TextView.java:3405) at android.widget.EditText.setText(EditText.java:80) at android.widget.TextView.setText(TextView.java:3380) at kz.tem_tour.Booking.Mask$1.onTextChanged(Mask.java:40) at android.widget.TextView.sendOnTextChanged(TextView.java:7079) at android.widget.TextView.setText(TextView.java:3550) at android.widget.TextView.setText(TextView.java:3405) at android.widget.EditText.setText(EditText.java:80) at android.widget.TextView.setText(TextView.java:3380) at kz.tem_tour.Booking.Mask$1.onTextChanged(Mask.java:40) at android.widget.TextView.sendOnTextChanged(TextView.java:7079) at android.widget.TextView.setText(TextView.java:3550) at android.widget.TextView.setText(TextView.java:3405) at android.widget.EditText.setText(EditText.java:80) at android.widget.TextView.setText(TextView.java:3380) at kz.tem_tour.Booking.Mask$1.onTextChanged(Mask.java:40) at android.widget.TextView.sendOnTextChanged(TextView.java:7079) at android.widget.TextView.setText(TextView.java:3550) at android.widget.TextView.setText(TextView.java:3405) at android.widget.EditText.setText(EditText.java:80) at android.widget.TextView.setText(TextView.java:3380) at kz.tem_tour.Booking.Mask$1.onTextChanged(Mask.java:40) at android.widget.TextView.sendOnTextChanged(TextView.java:7079) at android.widget.TextView.setText(TextView.java:3550) at android.widget.TextView.setText(TextView.java:3405) at android.widget.EditText.setText(EditText.java:80) at android.widget.TextView.setText(TextView.java:3380) at kz.tem_tour.Booking.Mask$1.onTextChanged(Mask.java:40) at android.widget.TextView.sendOnTextChanged(TextView.java:7079) at android.widget.TextView.setText(TextView.java:3550) at android.widget.TextView.setText(TextView.java:3405) at android.widget.EditText.setText(EditText.java:80) at android.widget.TextView.setText(TextView.java:3380) at kz.tem_tour.Booking.Mask$1.onTextChanged(Mask.java:40) at android.widget.TextView.sendOnTextChanged(TextView.java:7079) at android.widget.TextView.setText(TextView.java:3550) at android.widget.TextView.setText(TextView.java:3405) at android.widget.EditText.setText(EditText.java:80) at android.widget.TextView.setText(TextView.java:3380) at kz.tem_tour.Booking.Mask$1.onTextChanged(Mask.java:40) at android.widget.TextView.sendOnTextChanged(TextView.java:7079) at android.widget.TextView.setText(TextView.java:3550) at android.widget.TextView.setText(TextView.java:3405) at android.widget.EditText.setText(EditText.java:80) at android.widget.TextView.setText(TextView.java:3380) at kz.tem_tour.Booking.Mask$1.onTextChanged(Mask.java:40) at android.widget.TextView.sendOnTextChanged(TextView.java:7079) at android.widget.TextView.setText(TextView 

Tell me what am doing wrong?

  • 2
    The setText method calls onTextChanged , which calls setText , which calls onTextChanged , which calls setText , which calls onTextChanged , which calls setText , which calls onTextChanged ... - Vladyslav Matviienko
  • Did not quite understand ( - DevOma

1 answer 1

I do not even know how to explain more clearly ...
ediTxt.setText(mascara); method ediTxt.setText(mascara); calls TextWatcher method, notifying the text manager that the text has changed. Inside the onTextChanged method onTextChanged you change the text again by calling the ediTxt.setText(mascara); method ediTxt.setText(mascara); , which again calls the onTextChanged method. And so on to infinity. More precisely, before the stack overflows.

  • How can I eliminate please tell me! - DevOma
  • Just the Mask works if the EditText is not in an Array, but in the usual way, for example. Just call thus, editText.addTextChangedListener (Mask.insert ("##. ##. ####", ListBirthDate.get (i))); - DevOma