android - IndexOutOfBoundsException setSpan (0 ... 1) ends beyond length 0 -
i using library material edittext label: https://github.com/rey5137/material/wiki/text-field nice library :)
but...
i using next code check entered symbols correct:
private boolean hascorrectsymbols(string input){ string tre = "[a-za-z0-9\\@\\#\\$\\%\\&\\*\\(\\)\\-\\+\\_\\;\\:\\?\\.\\,\\!]+$"; if (input.matches(tre)){ return true; } return false; } for checking correct symbols using textwatcher:
meditpass.addtextchangedlistener(new textwatcher() { @override public void beforetextchanged(charsequence s, int start, int count, int after) {} @override public void ontextchanged(charsequence s, int start, int before, int count) { if (s.length() == 1 && !loginpasshascorrectsymbols(s.tostring())){ meditpass.gettext().clear(); string mess = getstring(r.string.toast_login_uselatin); showtoastmessage(mess); } else if (s.length() >1 && !loginpasshascorrectsymbols(s.tostring())) { string mess = getstring(r.string.toast_login_uselatin); showtoastmessage(mess); string text = s.tostring(); text = text.substring(0, start); meditpass.settext(text); meditpass.setselection(start); } } @override public void aftertextchanged(editable s) {} }); if first symbol correct , second 1 example wrong - system cut last entered (wrong) symbol , set cursor last text position, if first symbol prohibited symbol - crash error:
java.lang.indexoutofboundsexception: setspan (0 ... 1) ends beyond length 0 @ android.text.spannablestringbuilder.checkrange(spannablestringbuilder.java:1016) @ android.text.spannablestringbuilder.setspan(spannablestringbuilder.java:592) @ android.text.spannablestringbuilder.setspan(spannablestringbuilder.java:588) @ android.text.method.passwordtransformationmethod.ontextchanged(passwordtransformationmethod.java:108) @ android.text.spannablestringbuilder.sendtextchanged(spannablestringbuilder.java:962) @ android.text.spannablestringbuilder.replace(spannablestringbuilder.java:496) @ android.text.spannablestringbuilder.replace(spannablestringbuilder.java:435) @ android.text.spannablestringbuilder.replace(spannablestringbuilder.java:30) @ android.view.inputmethod.baseinputconnection.replacetext(baseinputconnection.java:683) @ android.view.inputmethod.baseinputconnection.committext(baseinputconnection.java:198) @ com.android.internal.widget.editableinputconnection.committext(editableinputconnection.java:183) @ com.android.internal.view.iinputconnectionwrapper.executemessage(iinputconnectionwrapper.java:279) @ com.android.internal.view.iinputconnectionwrapper$myhandler.handlemessage(iinputconnectionwrapper.java:77) @ android.os.handler.dispatchmessage(handler.java:102) @ android.os.looper.loop(looper.java:136) @ android.app.activitythread.main(activitythread.java:5097) @ java.lang.reflect.method.invokenative(native method) @ java.lang.reflect.method.invoke(method.java:515) @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:785) @ com.android.internal.os.zygoteinit.main(zygoteinit.java:601) @ dalvik.system.nativestart.main(native method) any ideas why happen? , how fix this??
in code snippet, shorten text displayed in edittext (so last valid position start-1), still try set selection position start.
text = text.substring(0, start); meditpass.settext(text); meditpass.setselection(start); [edited]
assuming toast message prompting user fix error, think want set selection first character in edittext bad symbol. here sample code doing that:
// reusable pattern (at class level) defines regex bad characters. private static final pattern illegal_char_pattern = pattern.compile( "[^a-za-z0-9\\@\\#\\$\\%\\&\\*\\(\\)\\-\\+\\_\\;\\:\\?\\.\\,\\!]" ); // replacement listener code. meditpass.addtextchangedlistener(new textwatcher() { @override public void beforetextchanged(charsequence s, int start, int count, int after) { } @override public void ontextchanged(charsequence s, int start, int before, int count) { if (s.length() == 0 || count == 0) { return; } matcher matcher = illegal_char_pattern.matcher(s); if (matcher.find()) { int firstillegalpos = matcher.start(); meditpass.setselection(firstillegalpos); string mess = getstring(r.string.toast_login_uselatin); showtoastmessage(mess); } } @override public void aftertextchanged(editable s) { } });
Comments
Post a Comment