【问题标题】:How to change the text style from bold to normal如何将文本样式从粗体更改为正常
【发布时间】:2019-04-01 22:52:31
【问题描述】:

我可以将文本从正常更改为粗体,但我无法从粗体更改为正常。我不知道我错过了什么。

 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;
                }
            }
        }
    });

【问题讨论】:

  • 没有转到其他部分吗?
  • 即使文本是粗体,也只能一次又一次地转到 if 部分
  • 我认为它与 bodyText 相关,但无法弄清楚如何设置 s.getTypeface()?
  • boldtext 和 bodyText 有什么区别?
  • 根据代码,您需要再次单击文本视图以删除粗体。您是否尝试使用焦点更改侦听器并在文本视图失去焦点时移除焦点?

标签: java android


【解决方案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);
    }
}

【讨论】:

  • 但这会将整个文本设置为粗体/正常。看来他只想更改文本的选定部分。
  • @Ridcully 感谢您的评论,我已经更新了我的答案。
  • 为什么要给 if (spans.size == 0) 这个条件??我不需要这个条件。这仅在我根本不选择文本时才有效。我需要选择文本,然后点击粗体按钮来加粗和取消粗体。
  • s.spans(sStart, sEnd, StyleSpan.class) 将在您的文本选择中找到并返回一个 StyleSpan 数组,并假设您的文本只有粗体和普通样式,然后spans.size == 0 会告诉您您的文本选择不包含粗体文本,因此您可以安全地将整个文本范围设置为粗体,否则删除所有粗体跨度。还是没有意义?
【解决方案2】:

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

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

【讨论】:

  • 我给定的问题代码正在运行,但问题出在“ if (bodyText.getTypeface().getStyle()==Typeface.NORMAL ) ”条件下。每次它进入 if 条件时,即使文本是粗体的。我需要将 if 条件中的此语句从 bodyText 更改为 Spannable s,但我不知道如何为 if 条件中的 Spannable 文本给出相同的语句。
【解决方案3】:
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);
            }
        }
    }
}

这里,text = Yout edittext text,


type = 你的粗体字,


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


selEnd = 编辑文本的选择结束

【讨论】:

  • 这可以在按钮点击下工作吗?在按钮操作下,它无法识别编辑文本和类型。
  • 首先检查edittext是否有选择,是的,它会在按钮点击下工作。
猜你喜欢
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多