Screenshot_2022-09-14-14-00-15-45_e39d2c7de19156b.jpg
首先看微信的效果
當(dāng)選中@的人的時(shí)候揍瑟,EditText里面填充 @東東娃,這個(gè)比較簡(jiǎn)單刃泡,但是有2個(gè)細(xì)節(jié)
1潦俺、按表情面板刪除按鈕或者中文鍵盤刪除按鈕的時(shí)候,會(huì)直接刪除整個(gè) @東東娃 這個(gè)整體
2狼牺、按英文鍵盤刪除按鈕的時(shí)候 是逐步刪除 @東東娃 > @東東 > @東 > @ >
因此簡(jiǎn)單的通過(guò)setText("@東東娃") 就不太滿足需求羡儿,因此我們需要自定義
CharacterStyle
廢話不說(shuō)上代碼
1、比如合適的時(shí)候調(diào)用 appendAtSpan("@東東娃");
public void appendAtSpan(String atText){
Editable editable = messageEditText.getEditableText();
Spannable spannable = new SpannableString(atText);
spannable.setSpan(new TextImageSpan(), 0, atText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
editable.insert(messageEditText.getSelectionStart(),spannable);
}
2是钥、自定義文字Span
按表情面板刪除按鈕或者中文鍵盤刪除按鈕的時(shí)候掠归,會(huì)直接刪除整個(gè) @東東娃 這個(gè)整體
package com.farsunset.hoxin.common.widget.span;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.text.style.ReplacementSpan;
public class TextImageSpan extends ReplacementSpan {
@Override
public int getSize(Paint paint, CharSequence text,int start,int end,Paint.FontMetricsInt fm) {
String spanText = text.subSequence(start,end).toString();
return (int) paint.measureText(spanText);
}
@Override
public void draw(Canvas canvas, CharSequence text,int start,int end, float x,
int top, int y, int bottom, Paint paint) {
String spanText = text.subSequence(start,end).toString();
canvas.drawText(spanText, x, y, paint);
}
}
3、一鍵刪除整個(gè)整體
public void onDeleteEmoticonClicked() {
KeyEvent keyEventDown = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL);
messageEditText.onKeyDown(KeyEvent.KEYCODE_DEL, keyEventDown);
}
自定義實(shí)現(xiàn)的效果
1悄泥、選擇要at的人
Screenshot_2022-09-14-14-21-24-01_0d77d35623cd3f9.jpg
2拂到、顯示效果
Screenshot_2022-09-14-14-21-52-97_0d77d35623cd3f9.jpg