不通过inputconnection / getExtractedText检索ImageSpans

时间:2014-08-27 10:07:34

标签: android android-edittext android-input-method spannablestring

我正在与一个问题作斗争。 我有一个应用程序,在EditText视图中写入一些格式化的文本。 它通过StyleableSpannableStringBuilder实现:

    public class StyleableSpannableStringBuilder extends SpannableStringBuilder
    {
        public StyleableSpannableStringBuilder appendMarkup(CharSequence text, Context context, int resID)
        {
            super.append(text);
            int startPos = length() - text.length();

            ImageSpan kwSpan = new ImageSpan(context, resID, ImageSpan.ALIGN_BASELINE); //(1)
            //BackgroundColorSpan kwSpan = new BackgroundColorSpan(Color.RED); //(2)
            //BulletSpan kwSpan = new BulletSpan(5, Color.RED); //(3)
            //StyleSpan kwSpan = new StyleSpan(Typeface.BOLD_ITALIC); //(4)

            setSpan(kwSpan, startPos, length(), SPAN_EXCLUSIVE_EXCLUSIVE);
            return this;

        }
    }

我是否使用(1),(2),(3),(4),我在EditText中获得了预期的相应装饰,因此“Spans正在工作”就EditText而言。

在围栏的另一边,我有一个InputMethod通过getCurrentInputConnection()。getExtractedText(...)访问此文本内容,如下所示:

    InputConnection ic = getCurrentInputConnection();
    if (ic != null)
    {
        ExtractedTextRequest req = new ExtractedTextRequest();
        req.token = mExtractedTextToken;

        req.hintMaxChars = MAX_REQUEST_CHARS;
        req.flags = InputConnection.GET_TEXT_WITH_STYLES;
        mExtractedText = ic.getExtractedText(req, InputConnection.GET_EXTRACTED_TEXT_MONITOR );

    } 

现在,仍然从InputMethod透视图中,我想要检索提取文本中的跨度。我通过这样的方式做了什么:

            CharacterStyle[ ] spans = mCurrentText.getSpans(0, mCurrentText.length(), CharacterStyle.class);
            Object[] rawSpans = mCurrentText.getSpans(0, mCurrentText.length(), Object.class);
            Log.e(TAG,"rawSpans :" + rawSpans.length + " / Spans : " + spans.length);

我的问题是来自(1)的ImageSpan跨度不是那些跨度数组(是跨度或rawSpans)的一部分,因此我无法检测到那些特定的跨度,并且无法进行进一步处理。但是,如果我使用(2)(3)或(4),那些就是那些跨度数组的一部分,正如预期的那样。 ImageSpan有什么特别之处,它完全绕过了提取的文本?

谢谢你的时间!

1 个答案:

答案 0 :(得分:0)

答案在TextView.java

/**
* This is used to remove all style-impacting spans from text before new
* extracted text is being replaced into it, so that we don't have any
* lingering spans applied during the replace.
*/
static void removeParcelableSpans(Spannable spannable, int start, int end) {
    Object[] spans = spannable.getSpans(start, end, ParcelableSpan.class);
    int i = spans.length;
    while (i > 0) {
        i--;
        spannable.removeSpan(spans[i]);
    }
}

这就是为什么他们没有进入IME,他们会在途中被消费和删除。