Android 无法通过inputconnection/getExtractedText检索ImageSpans

Android 无法通过inputconnection/getExtractedText检索ImageSpans,android,android-edittext,android-input-method,spannablestring,Android,Android Edittext,Android Input Method,Spannablestring,我正在为一个问题争论。 我有一个在EditText视图中写入一些格式化文本的应用程序。 它通过StyleableSpannableStringBuilder实现这一点: public class StyleableSpannableStringBuilder extends SpannableStringBuilder { public StyleableSpannableStringBuilder appendMarkup(CharSequence text,

我正在为一个问题争论。 我有一个在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中得到预期的相应装饰,因此跨度在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跨距不是这些跨距数组的一部分,无论是spans还是rawSpans,因此我无法检测这些特定跨距,也无法进行进一步的处理。但是,如果我使用2、3或4,这些都是span数组的一部分,正如预期的那样。ImageSpan有什么特别之处,它完全绕过了提取的文本

谢谢你的时间

答案就在这里


这就是为什么它们不能进入IME,它们会在一路上被消耗和删除。

我必须浏览操作系统的源代码以确认,但可能是渲染ImageSpan的部分在完成后也会调用removeSpan。
/**
* 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]);
    }
}