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中 如何设置一个字体即是粗体又是斜体又带有下划线?