1

チップの横にライブラリを使用してフリーテキストを受け入れることができる入力フィールド内にチップを実装しようとしていますsplitwise/TokenAutoComplete。1 つのチップは@mentionユーザー名を表示するものです。

ユーザーは記号@を入力でき、その後ポップアップが表示され、ユーザーがリストからユーザーを選択します。サインは@、新しいデータを取得してアダプターを更新する API 呼び出しをトリガーするだけです。リストからユーザーを選択すると、チップは@記号なしで表示され、名前だけが表示されます。また、ユーザーは自由なテキストを入力することもできます。その後、別のユーザーに言及したい場合は、@入力してリストから他のユーザーを選択するだけです。

例: ユーザーが「Hello @mark and @paul」と入力すると、結果は「Hello Marcand 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;
}

}

4

0 に答える 0