我正在尝试在输入字段中实现芯片,芯片旁边的芯片可以使用 library 接受自由文本splitwise/TokenAutoComplete
。一个芯片是@mention
显示用户名的。
用户可以输入符号@
,之后将显示弹出窗口,然后用户从列表中选择用户。该@
标志只是触发获取新数据和更新适配器的 API 调用。从列表中选择用户后,芯片将出现无@
符号,只有芯片名称。用户也可以输入一些自由文本,然后如果他想提及另一个用户,他只需输入@
并从列表中选择其他用户。
例如:用户输入“Hello @mark and @paul”,结果应该是“Hello Marc
and Paul
”。
这很好用,但问题是当我尝试用退格键删除芯片时。我有例外:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.xxx.yyy, PID: 7859
java.lang.IndexOutOfBoundsException: charAt: 12 >= length 12
at android.text.SpannableStringBuilder.charAt(SpannableStringBuilder.java:116)
at com.tokenautocomplete.TokenCompleteTextView$TokenTextWatcher.afterTextChanged(TokenCompleteTextView.java:1325)
at android.widget.TextView.sendAfterTextChanged(TextView.java:9078)
at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:11739)
at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:976)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:520)
at android.text.SpannableStringBuilder.delete(SpannableStringBuilder.java:216)
at android.text.SpannableStringBuilder.delete(SpannableStringBuilder.java:33)
at android.view.inputmethod.BaseInputConnection.deleteSurroundingText(BaseInputConnection.java:246)
at android.view.inputmethod.InputConnectionWrapper.deleteSurroundingText(InputConnectionWrapper.java:66)
at com.tokenautocomplete.TokenCompleteTextView$TokenInputConnection.deleteSurroundingText(TokenCompleteTextView.java:1561)
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:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6938)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
我不知道如何解决它,以及导致此异常的原因。
这是我的实现Tokenizer
:
class UsernameTokenizer implements MultiAutoCompleteTextView.Tokenizer {
@Override
public CharSequence terminateToken(CharSequence text) {
int i = text.length();
while (i > 0 && text.charAt(i - 1) == ' ') {
i--;
}
if (text instanceof Spanned) {
SpannableString sp = new SpannableString(text + " ");
TextUtils.copySpansFrom((Spanned) text, 0, text.length(), Object.class, sp, 0);
return sp;
} else {
return text + " ";
}
}
@Override
public int findTokenStart(CharSequence text, int cursor) {
int i = cursor - 1;
while (i > 0 && text.charAt(i) != '@') {
i--;
}
if (i < 1 || text.charAt(i) != '@') {
return cursor;
}
return i;
}
@Override
public int findTokenEnd(CharSequence text, int cursor) {
int i = cursor;
int len = text.length();
while (i < len) {
if (text.charAt(i) == ' ') {
return i;
} else {
i++;
}
}
return len;
}
}