【问题标题】:Android Edittext- Clearing SpansAndroid Edittext-清除跨度
【发布时间】:2012-02-22 21:10:43
【问题描述】:

我正在尝试通过调用 EditText.getText().clearSpans() 来获取 EditText 以清除其跨度。但是,如果我调用此方法,EditText 会开始出现奇怪的行为,换行符显示为框,然后我设置的任何跨度都在完全错误的位置。

所以我的问题是:如何从 EditText 中清除 span? (不调用 setText() - 文本可能有数千行长,而且速度太慢,无法频繁重绘)

非常感谢!

【问题讨论】:

    标签: android android-edittext gettext html redraw


    【解决方案1】:

    遇到了同样的问题。通过仅删除我添加到 EditText 的跨度类型来解决它。我猜 clearSpans 删除的内容超出了应有的范围。我对我使用的每种跨度类型都做了类似的事情:

    toRemoveSpans = et.getSpans(0, et.getText().length(), ForegroundColorSpan.class);
    for (int i = 0; i < toRemoveSpans.length; i++) 
        et.removeSpan(toRemoveSpans[i]);
    

    【讨论】:

    • 谢谢安德烈。实际上我之前已经设法解决了它(对不起,我只是忘了自己回答!),但是感谢您发布答案-我相信其他人会从中受益。
    • 确实有人这么做了。谢谢!
    • 如果你做了一个 editable.getSpans(0, editable.length(), Object.class);你可以看到它收集了很多东西。如果您手动删除所有这些,您将获得与 clearSpans 相同的结果。不确定 clearSpan 的用例是什么,因为它把事情搞砸了。
    【解决方案2】:
    private void clearSpans(@NonNull final Editable editable) {
        final Object[] spans = editable.getSpans(0, editable.length(), Object.class);
        for (final Object span : spans) {
            if (span instanceof ForegroundColorSpan || span instanceof SpannableTextView.CustomTypefaceSpan) {
                editable.removeSpan(span);
            }
        }
    }
    

    根据您添加的跨度类型,您可能需要包含的不仅仅是 ForegroundColorSpan。上述方法是一种简单的替换,很容易指定要删除的跨度。

    【讨论】:

      【解决方案3】:

      最好的答案是 "s" 是您要显示的字符串,而不是跨度,也可以是空字符串。

      代码在 Kotlin

      editText.setText(s)
      editText.setSelection(editText.text.length)
      

      【讨论】:

        猜你喜欢
        • 2014-05-28
        • 2011-08-10
        • 2019-07-25
        • 2018-01-13
        • 2020-03-14
        • 2014-12-02
        • 2014-06-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多