【问题标题】:How can I ignore the underlines Android adds while I'm editing formatted text?在编辑格式化文本时,如何忽略带下划线的 Android 广告?
【发布时间】:2015-07-18 11:32:40
【问题描述】:

我正在向我的应用程序添加富文本编辑字段。我正在使用标准的 EditText 字段,并且添加了一个工具栏,其中包含一些将跨度应用于所选文本的编辑按钮。这部分工作正常。

当我通过点击 EditText 的不同部分来更改文本选择时,我希望我的按钮通过突出显示所选文本是否已经匹配该格式来反映当前状态。例如,如果我点击一些粗体文本,粗体按钮应该突出显示。这部分也可以正常工作,但有以下例外:

有时在我编辑文本时,Android 会为单词添加下划线,颜色与文本颜色相同。这不是拼写错误下划线;我认为这是为了帮助选择单词,但我不确定它的目的是什么。问题是 Android 使用 Spannable 添加下划线,我的下划线按钮可以看到,并认为该单词已应用下划线样式,因此我的按钮在不应该激活时激活。

我的按钮使用此代码查看所选文本是否带下划线:

if (text.getSpans(selStart, selEnd, UnderlineSpan.class).length > 0) {
    isUnderlined = true;
}

我尝试查看下划线跨度的属性,但两种跨度的属性始终相同:

for (UnderlineSpan span : text.getSpans(selStart, selEnd, UnderlineSpan.class)) {
    Log.d("FormatToolbar", "found underline span: " + span.getUnderlying() + ", " + span.getSpanTypeId() + ", " + span.describeContents() + ", " + span.toString());
}

有什么方法可以区分我添加到文本中的下划线跨度和 Android 在我选择文本的不同部分时添加的临时跨度?

【问题讨论】:

    标签: android android-edittext richtext spannable


    【解决方案1】:

    我最终继承了 UnderlineSpan:

    import android.text.style.UnderlineSpan;
    
    public class MyUnderlineSpan extends UnderlineSpan {
        // we need this to tell the difference between underlines we add and underlines that Android adds temporarily as we edit the text
    }
    

    然后我将下划线跨度创建为 MyUnderlineSpan 的实例,并在检查所选文本的格式时对其进行测试:

    for (UnderlineSpan span : text.getSpans(selStart, selEnd, UnderlineSpan.class)) {
        if (span instanceof MyUnderlineSpan) {
            isUnderlined = true;
            break;
        }
    }
    

    子类甚至不需要任何属性,它只是一种识别我是否创建了跨度或 Android 是否创建的方法。有点傻,但确实有效。

    【讨论】:

      猜你喜欢
      • 2011-05-06
      • 2013-09-26
      • 2019-09-05
      • 2015-02-18
      • 2020-01-25
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      • 2013-08-22
      相关资源
      最近更新 更多