从EditText获取Spannable String

时间:2013-10-05 06:21:03

标签: android spannablestring

我已将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 个答案:

答案 0 :(得分:10)

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

如果您不特别关注跨度,您也可以致电Html.toHtml(spanStr)获取HTML标记版本。

修改:添加代码示例

这将抓取您想要的所有应用的StyleSpans。

    /* 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来确定您所拥有的跨度类型。此片段将检查特定范围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);
 }