4

I am using redmadrobot:inputmask to use card number input mask. Input mask is working properly, but when I try to delete digits from my input, the application crashes.

Here is my code.

ArrayList<String> affineFormats = new ArrayList<>();     
        affineFormats.add("[0000] [000] [000] [000]");
        affineFormats.add("[0000] [000000] [00000]");
        affineFormats.add("[0000] [0000] [0000] [0000]");
          String format = "[0000] [000] [000] [000]";
        MaskedTextChangedListener listener = new MaskedTextChangedListener(
                format,
                affineFormats,
  AffinityCalculationStrategy.CAPACITY,
                true,
                etCardNumber,
                null,
                new MaskedTextChangedListener.ValueListener() {
                    @Override
                    public void onTextChanged(boolean b, String s, String s1) {
                   //here some code
                    }
                });
        etCardNumber.addTextChangedListener(listener);

Error Log:

 java.lang.IndexOutOfBoundsException: setSpan (21 ... 21) ends beyond length 20
        at android.text.SpannableStringBuilder.checkRange(SpannableStringBuilder.java:1108)
        at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:680)
        at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:673)
        at android.text.Selection.setSelection(Selection.java:76)
        at android.text.Selection.setSelection(Selection.java:87)
        at android.widget.EditText.setSelection(EditText.java:104)
        at com.redmadrobot.inputmask.MaskedTextChangedListener.afterTextChanged(MaskedTextChangedListener.kt:192)
        at android.widget.TextView.sendAfterTextChanged(TextView.java:8366)
        at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:10557)
        at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:1061)
        at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:573)
        at android.text.SpannableStringBuilder.delete(SpannableStringBuilder.java:233)
        at android.text.SpannableStringBuilder.delete(SpannableStringBuilder.java:229)
        at android.view.inputmethod.BaseInputConnection.deleteSurroundingText(BaseInputConnection.java:252)
        at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:389)
        at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:78)
        at android.os.Handler.dispatchMessage(Handler.java:111)
        at android.os.Looper.loop(Looper.java:207)
        at android.app.ActivityThread.main(ActivityThread.java:5763)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:888)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:749)

Please help me resolve this issue.

ravi
  • 899
  • 8
  • 31
Android
  • 239
  • 1
  • 4
  • 12
  • Hey there, Could you also please paste your crash logcat? – ravi Sep 14 '19 at 16:29
  • Did you not post the code on the comment line that says `//here some code`. If you have not please edit your question and paste that too. – ravi Sep 15 '19 at 13:55

1 Answers1

0

Make sure you defined

<EditText
        ...
        android:digits="0123456789 "
        ...
/>

for you input field, including space, as allowed symbol, because it is allowed in your mask.

You can do the same programmatically

editText.setInputType(InputType.TYPE_CLASS_NUMBER);
editText.setKeyListener(DigitsKeyListener.getInstance("0123456789 "));

Worked for me.

Kirill Kostrov
  • 448
  • 4
  • 8