android微博表情条,类似新浪微博EditText,可@某人,#插入话题,表情

该博客详细介绍了如何在EditText中实现特殊字符的插入、选中删除效果以及监听删除键的操作。通过获取光标位置,使用SpannableStringBuilder来插入HTML格式的特殊字符,并在删除键按下时检查光标位置,实现特定字符的删除。此外,还实现了当光标位于特殊字符内部时自动移动到字符结尾的功能。
摘要由CSDN通过智能技术生成

在光标处插入特殊字符

//将特殊字符插入到EditText 中显示

int index = getSelectionStart();//光标位置

Editable editable = getText();//原先内容

SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(editable);

Spanned htmlText = Html.fromHtml(String.format(String.format("" + insertContent + "", insertColor)));

spannableStringBuilder.insert(index, htmlText);

spannableStringBuilder.insert(index + htmlText.length(), "\b");

setText(spannableStringBuilder);

setSelection(index + htmlText.length() + 1);

实现特殊字符选中删除效果

/**

* 监听删除键

* 1.光标在话题后面,将整个话题内容删除

* 2.光标在普通文字后面,删除一个字符

*

*/

this.setOnKeyListener(new View.OnKeyListener() {

@Override

public boolean onKey(View v, int keyCode, KeyEvent event) {

if (keyCode == KeyEvent.KEYCODE_DEL && event.getAction() == KeyEvent.ACTION_DOWN) {

int selectionStart = getSelectionStart();

int selectionEnd = getSelectionEnd();

/**

* 如果光标起始和结束不在同一位置,删除文本

*/

if (selectionStart != selectionEnd) {

// 查询文本是否属于目标对象,若是移除列表数据

String tagetText = getText().toString().substring(

selectionStart, selectionEnd);

for (int i = 0; i < insertModelList.size(); i++) {

InsertModel object = insertModelList.get(i);

if (tagetText.equals(object.getInsertContent())) {

insertModelList.remove(object);

}

}

return false;

}

int lastPos = 0;

Editable editable = getText();

// 遍历判断光标的位置

for (int i = 0; i < insertModelList.size(); i++) {

String objectText = insertModelList.get(i).getInsertContent();

lastPos = getText().toString().indexOf(objectText, lastPos);

if (lastPos != -1) {

if (selectionStart != 0 && selectionStart >= lastPos && selectionStart <= (lastPos + objectText.length())) {

// 选中话题

setSelection(lastPos, lastPos + objectText.length());

// 设置背景色

editable.setSpan(new BackgroundColorSpan(BACKGROUND_COLOR), lastPos, lastPos + objectText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

return true;

}

}

lastPos += objectText.length();

}

}

return false;

}

});

设置点击特殊字符光标自动移动到特殊字符之后

/**

* 监听光标的位置,若光标处于话题内容中间则移动光标到话题结束位置

*

*/

@Override

protected void onSelectionChanged(int selStart, int selEnd) {

super.onSelectionChanged(selStart, selEnd);

if (insertModelList == null || insertModelList.size() == 0)

return;

int startPostion = 0;

int endPostion = 0;

String insertContent = "";

for (int i = 0; i < insertModelList.size(); i++) {

insertContent = insertModelList.get(i).getInsertContent();

startPostion = getText().toString().indexOf(insertContent);

endPostion = startPostion + insertContent.length();

if (startPostion != -1 && selStart > startPostion

&& selStart <= endPostion) {// 若光标处于话题内容中间则移动光标到话题结束位置

setSelection(endPostion);

}

}}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值