我们说我这样发表评论:
嗨Andrea检查出来......在那个评论中我想强调Andrea,但每当我改变Andrea的值或当我删除单词的一个字符时,span会改变,问题是我使用{{ 1}},spannableString.setSpan(new StyleSpan(Typeface.BOLD), indexOfAt, highlightName.length() + indexOfAt, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
接受中间的单词并删除单词,如何在用户更改单词或删除单词的字符时删除跨度?
答案 0 :(得分:3)
您需要在编辑文本上观察文本更改。
假设您使用的EditText
被命名为commentEditText
commentEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
String comment = editable.toString();
if (comment.indexOf('@') != -1) {
//Asumming the name string
String name = "Andrea";
int atIndex = comment.indexOf('@');
int endIndex = atIndex + name.length() + 1;
if (endIndex == -1 || endIndex > editable.length()) {
endIndex = editable.length();
}
if (comment.toLowerCase().contains(name.toLowerCase())) {
editable.setSpan(new StyleSpan(Typeface.BOLD), atIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
} else {
StyleSpan[] spannable = editable.getSpans(atIndex, endIndex, StyleSpan.class);
if (spannable != null && spannable.length > 0) {
for (int i = 0; i < spannable.length; i++) {
editable.removeSpan(spannable[i]);
}
}
}
}
}
});
答案 1 :(得分:0)
您可以尝试使用TextWatcher,只需将TextWatcher添加到您想要在上面和之后实现的文本视图中
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//Do some magic here
}
现在,只要用户输入或删除任何字符,您就会在收到该方法后获得回调,然后重置您的范围。
答案 2 :(得分:0)
如果您使用SpannableString
,则必须在每次更改时重新创建整个内容。
您可以删除跨度,但无法更改源(注释),因为SpannableString
源文本是不可变的。
我建议您在评论的每次更改时创建SpannableString
,查找名称并标记它们,然后如果注释发生更改,则使用新的SpannableString
重复相同的操作。没有性能问题,因为评论的规模很小。
如果你想拥有一个可变对象,可以使用SpannableStringBuilder
,但它更复杂,不需要它。