首页 > 其他分享 >Android 通过重写EditText,实现最简单的@好友

Android 通过重写EditText,实现最简单的@好友

时间:2023-03-12 11:03:36浏览次数:47  
标签:String int EditText builder getText start Android 重写 public


4月份的代码,有人要用的话直接粘贴过去用就可以

/*
*作者:赵星海
*时间:18/04/23 10:28
*用途:@好友的实现
*/
public class MsgEditText extends AppCompatEditText {


public MsgEditText(Context context) {
super(context);
}

public MsgEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}

public MsgEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);

}

private StringBuilder builder;

/**
* 添加一个块,在文字的后面添加
*
* @param showText 显示到界面的内容
* @param userId 附加属性,比如用户id,邮件id之类的,如果不需要可以去除掉
*/
@SuppressLint("ResourceAsColor")
public void addAtSpan(String maskText, String showText, String userId) {
builder = new StringBuilder();
if (!TextUtils.isEmpty(maskText)) {
//已经添加了@
builder.append(maskText).append(showText).append(" ");
} else {
builder.append(showText).append(" ");
}
getText().insert(getSelectionStart(), builder.toString());
SpannableString sps = new SpannableString(getText());

int start = getSelectionEnd() - builder.toString().length() - (TextUtils.isEmpty(maskText) ? 1 : 0);
int end = getSelectionEnd();
makeSpan(sps, new UnSpanText(start, end, builder.toString()), userId);
setText(sps);
setSelection(end);
}

//获取用户Id列表
public String getUserIdString() {
MyTextSpan[] spans = getText().getSpans(0, getText().length(), MyTextSpan.class);
StringBuilder builder = new StringBuilder();
for (MyTextSpan myTextSpan : spans) {
String realText = getText().toString().substring(getText().getSpanStart(myTextSpan), getText().getSpanEnd(myTextSpan));
String showText = myTextSpan.getShowText();
if (realText.equals(showText)) {
builder.append(myTextSpan.getUserId()).append(",");
}
}
if (!TextUtils.isEmpty(builder.toString())) {
builder.deleteCharAt(builder.length() - 1);
}
return builder.toString();
}

//生成一个需要整体删除的Span
private void makeSpan(Spannable sps, UnSpanText unSpanText, String userId) {
MyTextSpan what = new MyTextSpan(unSpanText.returnText, userId);
int start = unSpanText.start;
int end = unSpanText.end;
sps.setSpan(what, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}


@Override
protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
super.onTextChanged(text, start, lengthBefore, lengthAfter);
//向前删除一个字符,@后的内容必须大于一个字符,可以在后面加一个空格
if (lengthBefore == 1 && lengthAfter == 0) {
MyTextSpan[] spans = getText().getSpans(0, getText().length(), MyTextSpan.class);
for (MyTextSpan myImageSpan : spans) {
if (getText().getSpanEnd(myImageSpan) == start && !text.toString().endsWith(myImageSpan.getShowText())) {
getText().delete(getText().getSpanStart(myImageSpan), getText().getSpanEnd(myImageSpan));
break;
}
}
}

}

private class MyTextSpan extends MetricAffectingSpan {
private String showText;
private String userId;

public MyTextSpan(String showText, String userId) {
this.showText = showText;
this.userId = userId;
}


public String getShowText() {
return showText;
}

public String getUserId() {
return userId;
}

@Override
public void updateMeasureState(TextPaint p) {

}

@Override
public void updateDrawState(TextPaint tp) {

}
}

private class UnSpanText {
int start;
int end;
String returnText;

UnSpanText(int start, int end, String returnText) {
this.start = start;
this.end = end;
this.returnText = returnText;
}
}


}

 

标签:String,int,EditText,builder,getText,start,Android,重写,public
From: https://blog.51cto.com/u_13520184/6115618

相关文章

  • Android与H5(JavaScript)之间的简单交互
    Android响应Js的动作 假设网页端要调用Android原生的方法:showToast();1.做一个盆子接收消息(创建一个工具类,写一个方法(*带注解))publicclassJavaScriptMethod{......
  • Android资源文件特殊字符转义编码
    举个栗子啊,我今天用了@这个符号写了好多次都没写成功,原因出在哪里:"@好友"这样就报红;"@好友"这样就没事了 .所以呢以下的 某些编码不允许放在开头,到前......
  • Android透明状态栏和沉浸式的实现
    Android透明状态栏和沉浸式的实现1.什么是沉浸式根据百度百科上的定义,沉浸式就是要给用户提供完全沉浸的体验,使用户有一种置身于虚拟世界之中的感觉。其真正含义并不是大家......
  • Android 控件模拟点击和事件转移
    直接上代码 想看的看一下吧 主要是每次用到都忘记这个方法名... 记录一下子//焦点转移mContentTv.setOnClickListener(newView.OnClickListener(){......
  • Android中点击按钮获取星级评分条的评分
    场景效果 注:关注公众号霸道的程序猿获取编程相关电子书、教程推送与免费下载。实现将布局改为LinearLayout,并通过android:orientation="vertical">设置为垂直布局,然后添......
  • Android 近期关注的文章和内容位运算符使用场
    App启动流程分析 ​​https://zhuanlan.zhihu.com/p/59801160​​ Application启动流程 ​​https://www.jianshu.com/p/14d54a76b16f​​Kotlin基础语法 ​​ https:......
  • Android native项目编译v7a时-Werror参数导致报错
    在GitHub上下载了一个demo,自己编译运行时,v8a的so是可以正常编译运行的,但是就是v7a的不能也一直报错,最后发现在Android.mk文件里去掉-Werror字段就可以了。于是上网了解了一......
  • 使用Unity3D在PC+Android端截图保存,再添加到数据库中
    前提:1.使用的工具为Unity2021+VS2019+mysql8.02.使用的支持包         3.Unity组件  代码usingUnityEngine;usingSy......
  • 在Android 实现SD卡热插拔机制时,需要注意的几个方面
      1,sd卡热插拔机制的实现需要软件和硬件同时配合才能实现。 2,在电路上,需要一根单独的检测pin脚,通过检测pin脚的高低电平来检测sd卡的插拔动作,并在dws中将其配置成上拉......
  • Android中获取IMEI码
    //getIMEI码StringIMEI=this.getSystemService(Context.TELEPHONY_SERVICE).getDeviceId();StringmyIMSI=android.os.SystemProperties.get(android.teleph......