7

我正在尝试在您键入文本时将字体颜色应用于 EditText 中的文本。但是,它只是非常不一致,这意味着有时如果您键入一个空格,该空格前面的文本将恢复为默认的黑色。或者,如果我将光标放在一个单词的中间并开始输入整个单词会改变颜色,而不仅仅是我正在输入的文本。不过,粗体、斜体和下划线似乎效果很好。我如何保证只有我输入的文本会受到字体颜色的影响?

请参阅下面的“尺寸和颜色”评论...

     contentEdit.addTextChangedListener(new TextWatcher() { 
            public void afterTextChanged(Editable s) { 

                //add style as the user types if a toggle button is enabled
                ToggleButton boldButton = (ToggleButton) findViewById(R.id.bold);
                ToggleButton emButton = (ToggleButton) findViewById(R.id.italic);
                ToggleButton underlineButton = (ToggleButton) findViewById(R.id.underline);

                int position = Selection.getSelectionStart(contentEdit.getText());

                try{
                    if (position < 0){
                        position = 0;
                    }

                    if (position > 0){

                        if (styleStart > position || position > (cursorLoc + 1)){
                            //user changed cursor location, reset
                            if (position - cursorLoc > 1){
                                //user pasted text
                                styleStart = cursorLoc;
                            }
                            else{
                                styleStart = position - 1;
                            }
                        }

                        if (boldButton.isChecked()){  
                            StyleSpan[] ss = s.getSpans(styleStart, position, StyleSpan.class);

                            for (int i = 0; i < ss.length; i++) {
                                if (ss[i].getStyle() == android.graphics.Typeface.BOLD){
                                    s.removeSpan(ss[i]);
                                }
                            }
                            s.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), styleStart, position, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                        }
                        if (emButton.isChecked()){
                            StyleSpan[] ss = s.getSpans(styleStart, position, StyleSpan.class);

                            for (int i = 0; i < ss.length; i++) {
                                if (ss[i].getStyle() == android.graphics.Typeface.ITALIC){
                                    s.removeSpan(ss[i]);
                                }
                            }
                            s.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), styleStart, position, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                        }
                        if (underlineButton.isChecked()){
                            UnderlineSpan[] ss = s.getSpans(styleStart, position, UnderlineSpan.class);

                            for (int i = 0; i < ss.length; i++) {
                                s.removeSpan(ss[i]);
                            }
                            s.setSpan(new UnderlineSpan(), styleStart, position, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                        }

                        //SIZE AND COLOR//////////////////////////////////////////////////////
                       s.setSpan(new ForegroundColorSpan(m_color), position, position, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
                       s.setSpan(new AbsoluteSizeSpan(m_curSize, true), position, position, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
}
                }
                catch(Exception e){
                    //Toast.makeText(m_ctx, m_ctx.gets, Toast.LENGTH_LONG).show();
                    showMessage(R.string.NOTE_WARNING_STYLE,m_utils.MSGTYPE_WARNING);
                }

                cursorLoc = Selection.getSelectionStart(contentEdit.getText());
            }
4

3 回答 3

8

您可以使用模式来查找单词,然后将任何跨度应用于单词。

@Override
public void afterTextChanged(Editable s) {
    Spannable textSpan = s;
    final Pattern pattern = Pattern.compile("\\w+");
    final Matcher matcher = pattern.matcher(textSpan);
    while (matcher.find()) {
        start = matcher.start();
        end = matcher.end();
        textSpan.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.red)), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

    }

而已。它将突出显示您输入的所有匹配单词。希望它有所帮助。

于 2014-09-16T17:27:06.383 回答
1

我将 Spannable 的开头更改positionposition - 1

//Color
s.setSpan(new ForegroundColorSpan(m_color), 
          position-1, 
          position, 
          Spannable.SPAN_INCLUSIVE_INCLUSIVE);
//Size
s.setSpan(new AbsoluteSizeSpan(m_curSize, true), 
          position-1, 
          position, 
          Spannable.SPAN_INCLUSIVE_INCLUSIVE);
于 2013-08-24T05:44:57.940 回答
1

像这样……

public static SpannableString parseActiveReply(String name, String body) {
    SpannableString sp = new SpannableString(name + " " + body);
    // 设置用户名字体加粗、高亮
    sp.setSpan(new ForegroundColorSpan(Color.parseColor("#5FADC7")), 0,
            name.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    // sp.setSpan(new ForegroundColorSpan(Color.parseColor("#5FADC7")), 0,
    // 0,
    // Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    return sp;
}
于 2013-08-29T05:46:25.530 回答