我正在与一个问题作斗争。 我有一个应用程序,在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有什么特别之处,它完全绕过了提取的文本?
谢谢你的时间!
答案 0 :(得分:0)
/**
* 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,他们会在途中被消费和删除。