android - 从 EditText 获取 Spannable String

标签 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,尽管它显示的是斜体和粗体文本。

请帮忙。

最佳答案

根据您发布的代码,您正在将新跨度传递给 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);
 }

关于android - 从 EditText 获取 Spannable String,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19194700/

相关文章:

javascript - 如何实现 bxslider Thumbnail pager Next prev 按钮

java - 自动重复本地通知?

java - TextView 中的 Roboto 浅色和 Roboto 粗体

java - Jackson 数组到 Pojo 只能在 Android 上运行

java - RecyclerView 中的项目数组

android - 识别加速度计模式的神经网络

android - 如何将资源文件夹中的自定义字体设置为 Android 中操作栏的标题?

java - 查找 EditText 可编辑的 getSpans 开始和结束索引

android - 如何格式化字符串然后通过注解改变样式

java - 使用可扩展字符串设置两个第一个单词的样式