@消息界面删除逻辑

This commit is contained in:
18401019693
2022-10-08 18:09:37 +08:00
parent 80655a8662
commit 8cf76a13e0
17 changed files with 355 additions and 33 deletions

View File

@@ -0,0 +1,17 @@
package com.yunbao.common.event;
import com.yunbao.common.bean.BaseModel;
import com.yunbao.common.bean.OlineUserlistModel;
public class LiveInputEvent extends BaseModel {
private OlineUserlistModel model;
public OlineUserlistModel getModel() {
return model;
}
public LiveInputEvent setModel(OlineUserlistModel model) {
this.model = model;
return this;
}
}

View File

@@ -0,0 +1,17 @@
package com.yunbao.common.event;
import com.yunbao.common.bean.BaseModel;
import com.yunbao.common.bean.OlineUserlistModel;
public class OlineEvent extends BaseModel {
private OlineUserlistModel model;
public OlineUserlistModel getModel() {
return model;
}
public OlineEvent setModel(OlineUserlistModel model) {
this.model = model;
return this;
}
}

View File

@@ -0,0 +1,36 @@
package com.yunbao.common.utils;
import java.io.IOException;
import taobe.tec.jcc.JChineseConvertor;
/**
* 繁體簡體轉換類
*/
public class WordsTypeUtil {
//繁体转成简体
public static String changeSimplified(String changeText) {
try {
JChineseConvertor jChineseConvertor = JChineseConvertor
.getInstance();
changeText = jChineseConvertor.t2s(changeText);
} catch (IOException e) {
e.printStackTrace();
}
return changeText;
}
//简体转繁体
public static String changeTraditional(String changeText) {
try {
JChineseConvertor jChineseConvertor = JChineseConvertor
.getInstance();
changeText = jChineseConvertor.s2t(changeText);
} catch (IOException e) {
e.printStackTrace();
}
return changeText;
}
}

View File

@@ -0,0 +1,111 @@
package com.yunbao.common.views.weight;
import android.graphics.Color;
import android.text.Editable;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
import com.yunbao.common.bean.OlineUserlistModel;
import java.util.HashMap;
import java.util.Map;
//输入监听
public class AtTextWatcher implements TextWatcher {
private Map<String, OlineUserlistModel> spanMap = new HashMap<>();
private EditText input;
private SpannableStringBuilder spannableStringBuilder;
private SpannableStringBuilder beforeStr, afterText;
private boolean removeListener = true;
public AtTextWatcher() {
spannableStringBuilder = new SpannableStringBuilder();
}
public void insertTextForAt(OlineUserlistModel model, EditText input) {
this.input = input;
if (!spanMap.containsKey(model.getId())) {
if (!TextUtils.isEmpty(input.getText())){
spannableStringBuilder = new SpannableStringBuilder(input.getText());
}
String nameStr = model.getUserNicename();
int startIndex = input.getSelectionStart();//光标的位置
int endIndex = startIndex + nameStr.length();//字符结束的位置
spanMap.put(model.getId(), model);
//插入要添加的字符此处是为了给span占位
input.getText().insert(startIndex, "@" + nameStr);
//1、使用mEditText构造一个SpannableString
StringBuffer atName = new StringBuffer();
atName.append("@").append(nameStr);
spannableStringBuilder.append(atName.toString());
AtUserForegroundColorSpan span = new AtUserForegroundColorSpan(Color.parseColor("#2a92f7"));
span.setAtContent(atName.toString());
span.setUid(model.getId());
span.setName(nameStr);
spannableStringBuilder.setSpan(span,
startIndex, endIndex + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
input.setTextKeepState(spannableStringBuilder);
input.setOnKeyListener((v, keyCode, event) -> {
if (keyCode == KeyEvent.KEYCODE_DEL && event.getAction() == KeyEvent.ACTION_DOWN) {
if (removeListener) {
input.addTextChangedListener(AtTextWatcher.this);
removeListener = false;
}
}
return false;
});
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
beforeStr = new SpannableStringBuilder(s);
}
@Override
public void onTextChanged(CharSequence afterStr, int start, int before, int count) {
afterText = new SpannableStringBuilder(afterStr);
}
@Override
public void afterTextChanged(Editable s) {
boolean change = false;
if (!TextUtils.isEmpty(beforeStr)) {
if (afterText.length() < beforeStr.length()) {//删除内容的操作
SpannableStringBuilder beforeSp = beforeStr;
AtUserForegroundColorSpan[] beforeSpans = beforeSp.getSpans(0, beforeSp.length(), AtUserForegroundColorSpan.class);
for (AtUserForegroundColorSpan span : beforeSpans) {
if (!s.toString().contains(span.getAtContent())) {
beforeSp.replace(beforeSp.getSpanStart(span), beforeSp.getSpanEnd(span), "");
beforeSp.removeSpan(span);
spanMap.remove(span.getUid());
input.removeTextChangedListener(this);
removeListener = true;
change = true;
}
}
beforeStr = null;
if (change) {
input.setTextKeepState(beforeSp);
spannableStringBuilder = beforeSp;
} else {
input.setTextKeepState(afterText);
spannableStringBuilder = afterText;
}
}
}
}
}

View File

@@ -0,0 +1,40 @@
package com.yunbao.common.views.weight;
import android.text.style.ForegroundColorSpan;
public class AtUserForegroundColorSpan extends ForegroundColorSpan {
public String name;
public String uid;
public String atContent;
public AtUserForegroundColorSpan(int color) {
super(color);
}
public String getUid() {
return uid;
}
public AtUserForegroundColorSpan setUid(String uid) {
this.uid = uid;
return this;
}
public String getName() {
return name;
}
public AtUserForegroundColorSpan setName(String name) {
this.name = name;
return this;
}
public String getAtContent() {
return atContent;
}
public AtUserForegroundColorSpan setAtContent(String atContent) {
this.atContent = atContent;
return this;
}
}