Android 无法通过inputconnection/getExtractedText检索ImageSpans
我正在为一个问题争论。 我有一个在EditText视图中写入一些格式化文本的应用程序。 它通过StyleableSpannableStringBuilder实现这一点: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,
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]);
}
}