Java 在Android中更改范围内的文本时删除范围

Java 在Android中更改范围内的文本时删除范围,java,android,html,Java,Android,Html,假设我这样评论: 嗨,安德里亚,看看这个。。。。。在这篇评论中,我想强调Andrea,但每当我更改Andrea的值或删除单词中的一个字符时,span就会改变,问题是我使用的是spannableString.setSpan(新样式span(Typeface.BOLD)、indexOfAt、highlightName.length()+indexOfAt、span.span_EXCLUSIVE),SuxObjaveSuviv.Auxor 在中间接受单词和删除单词,当用户改变单词或删除单词的字符时,如

假设我这样评论:
嗨,安德里亚,看看这个。。。。。在这篇评论中,我想强调Andrea,但每当我更改Andrea的值或删除单词中的一个字符时,span就会改变,问题是我使用的是
spannableString.setSpan(新样式span(Typeface.BOLD)、indexOfAt、highlightName.length()+indexOfAt、span.span_EXCLUSIVE)
,SuxObjaveSuviv.Auxor <代码>在中间接受单词和删除单词,当用户改变单词或删除单词的字符时,如何删除跨度?

< P>你可以试试TextWatcher,只需将Twitter添加到你想在上面和在

中实现的文本视图中。
 @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
//Do some magic here
    }

现在,每当用户键入或删除任何字符时,您都会收到一个回调,在收到该回调后,您可以重置span。

如果您使用的是
SpannableString
,您必须在每次更改时重新创建整个内容

您可以删除跨距,但不能更改源(注释),因为
SpannableString
源文本是不可变的

我建议您在每次更改注释时创建
SpannableString
,查找名称并标记它们,然后如果注释发生更改,则使用新的
SpannableString
重复相同的操作。不会有性能问题,因为注释的大小很小


如果您想拥有一个可变对象,可以使用
SpannableStringBuilder
,但它更复杂,不需要它。

您需要注意编辑文本上的文本更改。 假设您使用的
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]);
                            }
                        }

                    }
                }
            }
        });
commentEditText.addTextChangedListener(新的TextWatcher(){
@凌驾
更改前的公共无效(CharSequence CharSequence,int i,int i1,int i2){
}
@凌驾
public void onTextChanged(CharSequence CharSequence,int i,int i1,int i2){
}
@凌驾
public void PostTextChanged(可编辑){
字符串注释=可编辑的.toString();
if(comment.indexOf('@')!=-1){
//Asumming名称字符串
String name=“Andrea”;
int atIndex=comment.indexOf('@');
int endIndex=atIndex+name.length()+1;
如果(endIndex==-1 | | endIndex>editable.length()){
endIndex=editable.length();
}
if(comment.toLowerCase().contains(name.toLowerCase())){
可编辑的.setSpan(新样式SPAN(Typeface.BOLD)、atIndex、endIndex、SPAN.SPAN_EXCLUSIVE_EXCLUSIVE);
}否则{
StyleSpan[]spannable=editable.getspan(atIndex,endIndex,StyleSpan.class);
如果(spannable!=null&&spannable.length>0){
对于(int i=0;i
解释了基本思想是获得文本更改的回调,这在这里实现。小提琴或代码将有助于回答这一问题。