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

Popular posts from this blog

1111. appearing after print sequence - php -

java - WARN : org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/board/] in DispatcherServlet with name 'appServlet' -

Ruby on Rails, ActiveRecord, Postgres, UTF-8 and ASCII-8BIT encodings -