Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将文字样式从粗体更改为普通_Java_Android - Fatal编程技术网

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

Java 如何将文字样式从粗体更改为普通,java,android,Java,Android,我可以将文本从普通更改为粗体,但无法从粗体更改为普通。我不知道我错过了什么 boldtext.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sStart = bodyText.getSelectionStart(); sEnd = bodyText.getSelectionEnd();

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

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

这是因为
TextView.getTypeface().getStyle()
StyleSpan.getStyle()
并不总是共享相同的样式。正如所料,您的
bodyText.getTypeface().getStyle()==Typeface.NORMAL
始终为真,因为您在部分文本上设置的是粗体span,而不是在
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);
    }
}

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

CharacterStyle[] toBeRemovedSpans = s.getSpans(0, s.length(),
                                                MetricAffectingSpan.class);
    for (int index = 0; index < toBeRemovedSpans.length; index++)
        s.removeSpan(toBeRemovedSpans[index]);
    }
CharacterStyle[]toBeRemovedSpans=s.getSpans(0,s.length(),
尺度效应(泛类);
for(int index=0;index
private static void\u删除范围(可扩展文本、样式类型、int selStart、int selEnd){
for(对象span:text.getspan(selStart、selEnd、Object.class)){
如果(类型匹配(span)){
int spanStart=text.getSpanStart(span);
int spanEnd=text.getSpanEnd(span);
int spanFlags=text.getSpanFlags(span);
如果(spanStartselEnd){
text.setSpan(span、selEnd、spanEnd、spanFlags);
}否则{
text.removeSpan(span);
}
}
}
}
这里,text=Yout edittext text


类型=你的粗体字脸


seleStart=编辑文本的选择开始



selEnd=编辑文本的选择结束

它没有转到其他部分吗?只反复转到if部分,即使文本为粗体,我也这么认为,这是与bodyText有关的,但无法确定如何设置s.getTypeface()?粗体文本和bodyText之间有什么区别?根据代码,您需要再次单击文本视图以删除粗体。当文本视图失去焦点时,是否尝试使用焦点更改侦听器并移除焦点?但这会将整个文本设置为粗体/普通。似乎他只想更改文本的选定部分。@Ridcully感谢您的评论,我已更新了我的答案。为什么要将此条件设置为if(span.size==0)??我不需要这个条件。这仅在我根本不选择文本时有效。我需要选择文本,然后点击加粗按钮加粗并取消绑定文本。
s.span(sStart,sEnd,StyleSpan.class)
将在您的文本选择中查找并返回
StyleSpan
数组,并假设您的文本仅具有加粗和普通样式,然后
span.size==0
将告诉您您的文本选择不包含粗体文本,因此您可以安全地将整个文本范围设置为粗体,否则请删除所有粗体跨距。或者它没有意义?在按钮点击下,它会工作吗?在“按钮操作”下,它无法识别编辑文本和类型。首先检查edittext是否有选择,是的,它将在按钮单击下工作。我给定的问题代码正在工作,但问题处于“如果(bodyText.getTypeface().getStyle()==Typeface.NORMAL)”状态。每次输入if条件时,即使文本为粗体。我需要将if条件中的这条语句从bodyText更改为Spannable s,但我不知道如何为if条件中的Spannable文本提供相同的语句。
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);
            }
        }
    }
}