Android - 设置粗体/斜体后再次使 EditText 正常

Posted

技术标签:

【中文标题】Android - 设置粗体/斜体后再次使 EditText 正常【英文标题】:Android - Make EditText Normal again after setting Bold / Italic 【发布时间】:2020-07-28 04:10:29 【问题描述】:

我想要一个 EditText,它应该使用户在单击按钮时键入的文本变为粗体/斜体/下划线/删除线。我可以使用以下方式设置粗体/斜体/下划线/删除线:

 StyleSpan(TypeFace.BOLD)
 StyleSpan(TypeFace.ITALIC)
 StyleSpan(UnderlineSpan())
 StyleSpan(StrikethroughSpan())

分别。但是,当我单击正常按钮时,我希望 EditText 使 StyleSpan 再次正常。我已经使用StyleSpan(Typeface.NORMAL) 使其在按钮单击时正常。但它不起作用。

所以,假设我应用粗体选项,然后应用斜体选项,它应该使将输入的文本变为粗体和斜体。这按预期工作:

现在,一旦我松开粗体和斜体按钮并再次按下普通按钮,我希望它再次使文本正常,因为我在单击普通按钮时设置了 StyleSpan(TypeFace.NORMAL)

但是,如您所见,它不起作用:

代码:

 private fun initiateFormatting(
    isBold : Boolean = false,
    isItalic : Boolean = false,
    typefaceCode: StyleSpan = StyleSpan(Typeface.BOLD),
    isUnderlineSpan: Boolean = false,
    isStrikeThroughSpan: Boolean = false,
    isNormal : Boolean = false
) 
    val startLength = mEditTextNoteContent.length()
    mEditTextNoteContent.addTextChangedListener(object : TextWatcher 
        override fun afterTextChanged(s: Editable) 
            if(startLength < mEditTextNoteContent.length()) 
                when 
                    isUnderlineSpan -> mEditTextNoteContent.text.setSpan(
                        UnderlineSpan(),
                        startLength,
                        mEditTextNoteContent.length(),
                        Spannable.SPAN_EXCLUSIVE_INCLUSIVE
                    )
                    isStrikeThroughSpan -> mEditTextNoteContent.text.setSpan(
                        StrikethroughSpan(),
                        startLength,
                        mEditTextNoteContent.length(),
                        Spannable.SPAN_EXCLUSIVE_INCLUSIVE
                    )
                    isNormal -> removeSpan(startLength)
                    isBold || isItalic -> 
                        mEditTextNoteContent.text.setSpan(
                            typefaceCode,
                            startLength,
                            mEditTextNoteContent.length(),
                            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
                        )
                    Log.d("Called", "" + typefaceCode.style)
                    
                
            
        

        override fun beforeTextChanged(
            s: CharSequence, start: Int,
            count: Int, after: Int
        ) 
        

        override fun onTextChanged(
            s: CharSequence, start: Int,
            before: Int, count: Int
        ) 

        
    )

【问题讨论】:

【参考方案1】:

StyleSpan(Typeface.NORMAL) 不起作用。您可以像 question 中的答案一样进行操作。那里所有的 StyleSpan 都被检查并且可以被删除。

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

【讨论】:

【参考方案2】:

试试这个方法,在这个方法中,你在第一个参数中传递 null 来重置以前的属性

textView.setTypeface(null, Typeface.NORMAL);

【讨论】:

这使一切正常,而不是将要输入的文本。 抱歉没有让你明白,“让一切正常”? 假设我有这个粗体文本,然后按下普通按钮,这样现在要输入的文本应该是普通的(即非粗体)。 TypeFace.NORMAL 将使上面的粗体文本正常化以及接下来要输入的内容。 好的,所以您想为相同的edittext制作不同样式的文本,为此您需要使用spannablebuilder的额外处理,您可以在其中传递文本的开始索引和文本的结尾编辑文本,以及您要为该特定部分应用的样式您可以google一下 我也这样做了。正如我在问题本身中所说的那样,除了将文本再次设置为 Normal 之外,我能够完成所有这些操作。

以上是关于Android - 设置粗体/斜体后再次使 EditText 正常的主要内容,如果未能解决你的问题,请参考以下文章

android 在xml的textStyle中 如何设置一个字体即是粗体又是斜体又带有下划线?

从我的网站向 Twitter 帐户发布推文时如何使文本变为粗体或斜体

一个字同时设置了粗体斜体,哪个先生效?

iPhone/iPad的UILabel如何设置粗体和斜体?

用 PIL 绘制粗体/斜体文本?

textview可以设置字体的粗体 斜体吗