EditText と TextWatcher があり、パターンをチェックして ClickableSpans を作成する場所を決定します。
private void checkSpans(){
Matcher matcher = Pattern.compile("(^|[ \\t\\n])#\\w+").matcher(text);
while (matcher.find()) {
BlueClickableSpan[] spans = getText().getSpans(matcher.start(), matcher.end(), BlueClickableSpan.class);
for (BlueClickableSpan span : spans) {
text.removeSpan(span);
}
text.setSpan(new BlueClickableSpan(),
matcher.start(),
matcher.end(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
これが私のカスタム Span クラスです。
private class BlueClickableSpan extends ClickableSpan {
@Override
public void onClick(View view) {
Spanned s = getText();
int start = s.getSpanStart(this);
int end = s.getSpanEnd(this);
String clickedString = s.subSequence(start, end).toString().trim();
if (onSpanClick != null)
onSpanClick.onClick(clickedString);
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(ContextCompat.getColor(IdeaFlowApp.getAppContext(), R.color.main_blue));
}
}
問題は、テキストをスパンで終了し、その後に文字がなく、その後にタップすると、スパンへのクリックとしてカウントされ、onClick が呼び出されることです。そのため、スパンの直後にカーソルを置いて編集を続けることができません。しかし、スパンの後の空白であっても、シンボルを印刷すると、スパンの後にカーソルを簡単に配置でき、すべて正常に機能します。クリック可能なスパンの後にシンボルがない場合、編集テキストのクリックを修正する方法はありますか?