【问题标题】:How android span act on input characters in EditTextandroid span 如何作用于 EditText 中的输入字符
【发布时间】:2016-05-10 03:33:22
【问题描述】:

我想实现一个效果,控制edittext中的输入字符是否使用span。

例如在EditText中可以使用

getEditableText().setSpan(new StyleSpan(Typeface.NORMAL), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

使选中的字符为BOLD。是否有解决方案,当用户启用粗体设置时,此后输入的每个字符都会加粗,一旦用户禁用粗体设置,之后输入的字符将不会粗体。

我尝试在 SpannableStringBuilder.setSpan() 中使用 Spanned.SPAN_EXCLUSIVE_INCLUSIVE 作为标志,但我只能控制 span 的效果何时开始,并且无法控制结束。

还尝试使用 TextWatcher 监听每个字符输入,并将 Span 设置为每个字符。

 @Override
protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter)
{
    setTextSpan(start, lengthBefore, lengthAfter);
}

private void setTextSpan(int start, int lengthBefore, int lengthAfter)
{
    if (isBold) {
        getEditableText().setSpan(new StyleSpan(Typeface.BOLD), start, start + lengthAfter, Spanned
                .SPAN_EXCLUSIVE_EXCLUSIVE);
    }
}

但是当使用Html.toHtml()时,每个字符都被<b></b>包裹。

点赞<p dir="ltr"><b>1</b><b>1</b><b>1</b><b>1</b><b>1</b><b>1</b></p>

我在SpannableStringBuilder.java中阅读了一些源代码,但没有找到任何改变span的效果范围的方法。

希望有人能给我一些建议。提前致谢。

【问题讨论】:

  • 你用的TextWatcher怎么样,有什么问题?
  • @Huo Chhunleng 很抱歉这么晚才回复。问题是,当我使用 TextWatcher 并输入一些字符时,显示是正确的,但是通过 Html.toHtml() 转换后,结果不是我想要的b>cde',但我想要的结果是 '

    abcde

    '
  • @Huo Chhunleng 这样就可以将选中的文字设置为粗体。我想要的效果是启用加粗后输入的所有字符都是粗体,禁用加粗后输入正常。跨度>
  • 很抱歉打断你,问题解决了吗?或者寻找其他方式来实现?如果是这样,非常感谢您的回复。

标签: android html spannablestring richedit spannable


【解决方案1】:

找到了一些有用的建议,你可以查看'Android EditText: how to apply spans when composing?'。

但是,还有另一个问题:标志 'SPAN_INCLUSIVE_INCLUSIVE' 设置字体 BOLD 效果很好。但是,当我切换到设置字体 NOT BOLD(只是恢复正常)时,插入的文本仍然是 BOLD。我不知道如何解决这个问题。

【讨论】:

  • 您好,我已经阅读了您提到的答案,该解决方案可以解决一些问题,但我遇到的情况比较复杂。我终于想到了两个解决方案。我将在我的回答中描述这些。
【解决方案2】:

首先,为 EditText 设置TextWatcher。那么有两种解决方案。
1.文本改变时,如果输入字符,使用removeSpan(),然后使用setSpan()重置span的范围。
2. 使用反射。 SpannableStringBuilder有成员调用mSpanEnds,这个数组记录了SpannableStringBuilder中所有span的位置信息,使用反射改变它的值。
我有一个解决方案 2 的 sample,这个示例可能有一些错误,但它在应用跨度中效果很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-18
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 2011-08-26
    • 2015-01-18
    相关资源
    最近更新 更多