0

我在爭論一點問題。 我有一個應用程序在EditText視圖中寫入一些格式化的文本。 它確實,通過一個StyleableSpannableStringBuilder:ImageSpans不通過inputconnection/getExtractedText檢索

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),I得到的的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); 

我的問題是,ImageSpan從(1)是不是那些跨陣列的一部分(可能是跨越或rawSpans)跨越,因此,我無法檢測這些特定的跨度,並且不能做進一步的處理。但是,如果我使用(2)(3)或(4),則這些是跨度數組的一部分,如預期的那樣。 ImageSpan有什麼特別之處,它完全繞過了提取的文本?

謝謝你的時間!

+0

我將不得不瀏覽操作系統的源代碼來確認,但它可能是呈現ImageSpan的一部分,它也會在完成後調用removeSpan。 – 0xAFEB 2014-08-28 23:11:31

回答

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,他們正在消耗並沿途移除。