android - EditText: sometimes all the Spans before the cursor are cleared -
as question states, keyboard action (only backspace seems this) clears spans have set before cursor.
here relevant bits of edittext:
// called constructors. private void init() { setsingleline(false); setimeoptions(editorinfo.ime_flag_no_extract_ui | editorinfo.ime_flag_no_enter_action); setinputtype(inputtype.type_class_text | inputtype.type_text_flag_no_suggestions | inputtype.type_text_flag_multi_line); settextisselectable(false); setcustomselectionactionmodecallback(new actionmode.callback() { public boolean oncreateactionmode(actionmode mode, menu menu) { return false; } public boolean onprepareactionmode(actionmode mode, menu menu) { return false; } public boolean onactionitemclicked(actionmode mode, menuitem item) { return false; } public void ondestroyactionmode(actionmode mode) {} }); addtextchangedlistener(new hashtagwatcher()); } @override public boolean issuggestionsenabled() { return false; } public hashtagspan[] getspans(editable from) { return from.getspans(0, from.length(), hashtagspan.class); } private class hashtagwatcher implements textwatcher { @override public void beforetextchanged(charsequence s, int start, int oldlength, int newlength) { synchronized (lock) { hashtagspan[] spans = getspans(gettext()); log.e(tag, "beforetextchanged: num spans "+spans.length); (int = 0; < spans.length; i++) { log.e(tag, " span "+i+":"); log.e(tag, " starts @ "+gettext().getspanstart(spans[i])); log.e(tag, " ends @ "+gettext().getspanend(spans[i])); } } } @override public void aftertextchanged(editable result) { synchronized (lock) { hashtagspan[] spans = getspans(result); log.e(tag, "aftertextchanged: num spans "+spans.length); (int = 0; < spans.length; i++) { log.e(tag, " span "+i+":"); log.e(tag, " starts @ "+result.getspanstart(spans[i])); log.e(tag, " ends @ "+result.getspanend(spans[i])); } } } }
you can see logging number of hashtagspans before , after text has changed.
99% of times number of spans before , after equal. when using backspace @ positions, get:
// beforetextchanged triggered backspace action @ pos 7... 11-13 14:28:55.217 32601-32601 e/hashtaglayout: beforetextchanged: num spans 2: 11-13 14:28:55.217 32601-32601 e/hashtaglayout: span 0: 11-13 14:28:55.217 32601-32601 e/hashtaglayout: starts @ 0 11-13 14:28:55.217 32601-32601 e/hashtaglayout: ends @ 3 11-13 14:28:55.217 32601-32601 e/hashtaglayout: span 1: 11-13 14:28:55.217 32601-32601 e/hashtaglayout: starts @ 3 11-13 14:28:55.217 32601-32601 e/hashtaglayout: ends @ 7 // right after.. 11-13 14:28:55.224 32601-32601 e/hashtaglayout: aftertextchanged: num spans 0
it makes no sense! did type backspace @ position 7, , before aftertextchanged() every span before position cleared.
how possible?
can related keyboard action? if how override behaviour? have tried playing inputconnection no results.
update
i think keyboard doing strange, clearing spans text. if disable auto-correction, (google stock keyboard):
everything starts working again. sucks. thought setting inputtype.type_text_flag_no_suggestions
enough avoid ime strange behaviours.
so guess need ime expert now.
how can override behaviour keyboard auto-correction, (on backspaces mostly) clears every span before cursor position?
update 2
it works if leave keyboard settings enabled, remove inputtype.type_text_flag_multi_line
. got hate android sometimes.. need multiline!
Comments
Post a Comment