最近在钻研 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 办法的实现逻辑,那一段代码我的确找不到任何问题,不过的确证实了获取出的块的程序会随着光标的所处地位而变动。如同这个问题影响不大,但我凑巧前面所要实现的一些性能却和这个数组的程序无关,比方最终统计,如果不加解决间接遍历这些数组就会遇到程序不敌对的问题,起初我对数组进行了一次 从新排序 才绕过了这个问题。

可能也是我第一次钻研安卓的起因(官网坑,最致命)。

相干环境:
API 24