如何将文本样式从粗体更改为普通

时间:2018-10-29 03:00:45

标签: java android

我可以将文本从普通更改为粗体,但无法从粗体更改为普通。我不知道我在想什么。

 boldtext.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            sStart = bodyText.getSelectionStart();
            sEnd = bodyText.getSelectionEnd();
            Spannable s = bodyText.getText();
            if (bodyText.getTypeface().getStyle()==Typeface.NORMAL ) {
                s.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), sStart, sEnd, 0);
                isBold = true;
            }
            else {
                for (CharacterStyle span : s.getSpans(sStart, sEnd, CharacterStyle.class)) {
                    if (span instanceof StyleSpan && ((StyleSpan)span).getStyle() == Typeface.BOLD)
                        s.removeSpan(span);
                         isBold = false;
                }
            }
        }
    });

3 个答案:

答案 0 :(得分:1)

这是因为TextView.getTypeface().getStyle()StyleSpan.getStyle()并不总是相同的风格。就像您期望的那样,bodyText.getTypeface().getStyle()==Typeface.NORMAL始终为真,因为您是在部分文本而不是TextView上设置粗体跨度。

相反,您可以尝试进行其他比较,例如:

Spannable s = bodyText.getText();
StyleSpan[] spans = s.getSpans(sStart, sEnd, StyleSpan.class)
if (spans.length == 0) {
    s.setSpan(new StyleSpan(Typeface.BOLD), sStart, sEnd, SPAN_EXCLUSIVE_EXCLUSIVE);
} else {
    for (StyleSpan span : spans) {
        s.remove(span);
    }
}

答案 1 :(得分:0)

您可以尝试使用以下代码删除跨度。

CharacterStyle[] toBeRemovedSpans = s.getSpans(0, s.length(),
                                                MetricAffectingSpan.class);
    for (int index = 0; index < toBeRemovedSpans.length; index++)
        s.removeSpan(toBeRemovedSpans[index]);
    }

答案 2 :(得分:0)

private static void _removeSpansInRange(Spannable text, StylingType type, int selStart, int selEnd) {
    for (Object span : text.getSpans(selStart, selEnd, Object.class)) {
        if (type.matches(span)) {
            int spanStart = text.getSpanStart(span);
            int spanEnd = text.getSpanEnd(span);
            int spanFlags = text.getSpanFlags(span);
            if (spanStart < selStart && selEnd < spanEnd) {
                text.setSpan(span, spanStart, selStart, spanFlags);
                if (StylingType.isSpecific(type)) {
                    text.setSpan(type.newInstance(span), selEnd, spanEnd, 34);
                }
            } else if (spanStart < selStart) {
                text.setSpan(span, spanStart, selStart, spanFlags);
            } else if (spanEnd > selEnd) {
                text.setSpan(span, selEnd, spanEnd, spanFlags);
            } else {
                text.removeSpan(span);
            }
        }
    }
}

此处,文本=您要编辑的文本,


type =您的粗体字样


seleStart =选择编辑文本的开始,


selEnd =编辑文本的选择结束