从 EditText 获取 Spanable String

Posted

技术标签:

【中文标题】从 EditText 获取 Spanable String【英文标题】:Get Spannable String from EditText 【发布时间】:2013-10-12 05:56:18 【问题描述】:

我已将SpannableString 设置为EditText,现在我想从EditText 获取此文本并获取其标记信息。我试过这样:

SpannableStringBuilder spanStr = (SpannableStringBuilder) et.getText();
int boldIndex = spanStr.getSpanStart(new StyleSpan(Typeface.BOLD));
int italicIndex = spanStr.getSpanStart(new StyleSpan(Typeface.ITALIC));

但它为粗体和斜体提供索引-1,尽管它显示的文本是斜体和粗体。

请帮忙。

【问题讨论】:

【参考方案1】:

从您发布的代码中,您将新跨度传递给 spanStr 并要求它找到它们。您需要参考实际应用的那些跨度的实例。如果这不可行或者您不想直接跟踪跨度,您可以简单地调用 getSpans 应用所有跨度。然后,您可以根据需要过滤该数组。

如果您不特别关心跨度,您也可以调用html.toHtml(spanStr) 来获取带有 HTML 标记的版本。

编辑:添加代码示例

这将获取您想要的所有已应用的 StyleSpan。

    /* From the android docs on StyleSpan: "Describes a style in a span. 
     * Note that styles are cumulative -- both bold and italic are set in 
     * separate spans, or if the base is bold and a span calls for italic, 
     * you get bold italic. You can't turn off a style from the base style."*/
StyleSpan[] mSpans = et.getText().getSpans(0, et.length(), StyleSpan.class);

这是StyleSpan 文档的链接。

如果您将各种跨度混合到一个集合/数组中,要选择您想要的跨度,您可以使用instanceof 来确定您拥有什么类型的跨度。这个 sn-p 将检查一个特定的 span mSpan 是否是 StyleSpan 的一个实例,然后打印它的开始/结束索引和标志。标志是描述跨度结束行为方式的常量,例如:它们是否包含并将样式应用于开始/结束索引处的文本,还是仅应用于开始/结束范围内索引处的文本输入)。

 if (mSpan instanceof StyleSpan)  
        int start = et.getSpanStart(mSpan);
        int end = et.getSpanEnd(mSpan);
        int flag = et.getSpanFlags(mSpan);
        Log.i("SpannableString Spans", "Found StyleSpan at:\n" +
                "Start: " + start + 
                 "\n End: " + end + 
                 "\n Flag(s): " + flag);
 

【讨论】:

我能够获得带有 HTML 标记的版本,但无法使用 getSpans。您能否提供一些代码来获取例如粗体跨度索引。我已将粗体跨度设置为与尝试获取它相同。 如何使用 getSpan? @pskink Object[] objArray = spanStr.getSpans(0, spanStr.length()-1, Object.class);它给了我类的数组,但是如何找到该类的索引? @pskink 索引从粗体文本开始 见跨度,developer.android.com/reference/android/text/…

以上是关于从 EditText 获取 Spanable String的主要内容,如果未能解决你的问题,请参考以下文章

android开发中怎么获取listview中多个edittext的值

如何从 EditText 获取字符?

Android,从edittext中获取文本[重复]

如何从 SQLite 数据库中获取数据并在 EditText 中显示

如何从android中的edittext中获取选定的文本?

如何从具有多个视图的 ListView 中的 EditText 获取文本?