最近在钻研 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