在Android

时间:2017-08-13 21:30:24

标签: java android html

我们说我这样发表评论: 嗨Andrea检查出来......在那个评论中我想强调Andrea,但每当我改变Andrea的值或当我删除单词的一个字符时,span会改变,问题是我使用{{ 1}},spannableString.setSpan(new StyleSpan(Typeface.BOLD), indexOfAt, highlightName.length() + indexOfAt, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)接受中间的单词并删除单词,如何在用户更改单词或删除单词的字符时删除跨度?

3 个答案:

答案 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,但它更复杂,不需要它。