删除范围内的文本时,跨度在Android中更改
让我们来说说我这样的评论: 嗨安德烈检查了这一点.....在该评论中,我想突出显示安德烈,但每当我改变值的安德列或当我删除单词的一个字符的跨度变化,问题是我正在使用spannableString.setSpan(new StyleSpan(Typeface.BOLD), indexOfAt, highlightName.length() + indexOfAt, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
,其中Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
接受中间的单词和删除单词,如何删除跨度当用户更改单词或删除单词的字符?删除范围内的文本时,跨度在Android中更改
您需要注意编辑文本上的文本更改。 假设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]);
}
}
}
}
}
});
您可以尝试TextWatcher这一点,只需添加TextWatcher你想上面实现的TextView并在
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//Do some magic here
}
现在,只要用户类型或删除任何字符在收到你会得到一个回调在这种方法你可以重置你的跨度。
解释了基本的想法是得到一个文本改变的回调,这是在这里实现的。 –
如果您使用的是SpannableString
,则必须在每次更改时重新创建所有内容。
您可以删除跨度,但不能更改源(注释),因为SpannableString
源文本是不可变的。
我建议您在创建SpannableString
的评论的每一个变化,寻找名称和标记他们,然后如果评论改变你重复同样的事情与一个新的SpannableString
。由于评论规模较小,因此不存在任何性能问题。
如果你想有一个可变对象,你可以使用SpannableStringBuilder
,但它更复杂,并且不需要它。
如果你分享一些代码,我可以帮助更多 – MaanooAk
小提琴或代码将有助于回答这个问题。 – Shuddh