Android 富文本獲取已繪製塊的順序問題

最近在研究 Android 平臺的富文本處理,瞭解到 SpannableString 這個類,類中提供了一個名叫 getSpans 的方法,用於獲取指定文本範圍內已繪製的 Span 塊,可是這個方法獲取出來的數據會出現莫名其妙的順序不一致的問題。好比一段文本中如果有幾個文字顏色塊,用這個方法會返回到一個類型數組中這些顏色塊,可是偶爾會出現數組順序先後不一致的問題,好比有時候數組第一個是獲取的紅色塊,有時候數組第一個又是另外一個顏色塊。我後來仔細測試了這個狀況,發現與光標所處的位置有關,個人代碼以下:前端

public class MainActivity extends AppCompatActivity {
    EditText editText1;
    Button button1;
    TextView textView1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText1 = findViewById(R.id.editText1);
        textView1 = findViewById(R.id.textView1);
        SpannableString spannableString = new SpannableString("Hello World!");
        spannableString.setSpan(new ForegroundColorSpan(Color.RED), 3, 4, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
        spannableString.setSpan(new ForegroundColorSpan(Color.GREEN), 6, 7, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
        editText1.setText(spannableString);
        button1 = findViewById(R.id.button1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SpannableString spannableString2 = new SpannableString(editText1.getText());
                ForegroundColorSpan[] foregroundColorSpans = spannableString2.getSpans(0, spannableString2.length(), ForegroundColorSpan.class);
                String text = "";
                for (ForegroundColorSpan foregroundColorSpan : foregroundColorSpans) {
                    text += spannableString2.getSpanStart(foregroundColorSpan) + ",";
                }
                textView1.setText(text);
            }
        });
    }
}

前端只有一個輸入框,一個按鈕和一個文本框。代碼首先給輸入框設置了一段富文本,文本中有兩個字符是兩個不一樣顏色的塊,點擊按鈕會調用 getSpans 方法並使用遍歷的方式組合一段結果文本,最終輸出顏色塊的開始位置到文本框中。問題如圖所示:數組

沒有研究過 getSpans 方法的實現邏輯,那一段代碼我確實找不到任何問題,不過確實證明了獲取出的塊的順序會隨着光標的所處位置而變化。好像這個問題影響不大,但我恰巧後面所要實現的一些功能卻和這個數組的順序有關,好比最終統計,若是不加處理直接遍歷這些數組就會遇到順序不友好的問題,後來我對數組進行了一次 從新排序 才繞過了這個問題。ide

可能也是我第一次研究安卓的緣由(官方坑,最致命)。測試

相關環境:
API 24spa

相關文章
相關標籤/搜索