乐趣区

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

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

相干环境:
API 24

退出移动版