我想在edittext中突出显示名称,
所以我有一个带有这些词的字符串数组
我创建了以下代码,如果在单词Array:
final Handler handler = new Handler();
final Runnable r = new Runnable()
{
public void run()
{
String allText = mac.getText().toString();
for(int i=0;i<allText.length();i++){
for(int j=0;j<darkBlue.length;j++){
if(allText.indexOf(darkBlue[j])!=-1){
Spannable WordtoSpan = new SpannableString(allText);
WordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), allText.indexOf(darkBlue[j]), allText.indexOf(darkBlue[j])+darkBlue[j].length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mac.setText(WordtoSpan);
mac.setSelection(mac.getText().length());//put the cursor at the end of the text.
}
}
}
handler.postDelayed(this, 1000);
}
};
handler.postDelayed(r, 1000);
问题是,UI每秒渲染一次,因此不让我与键盘交互,而且一切都表现得很慢。
你知道更好的替代方案吗?从一系列字符串中突出显示android中textedit中的几个单词?
答案 0 :(得分:0)
仅将setText和setselection发布到ui线程。不与ui元素直接交互的所有内容都应该在另一个线程上完成
答案 1 :(得分:0)
您的算法当然可以进行优化 - 稍后会在帖子中看到我的示例。但更重要的是,正如另一张海报所说,最好将工作卸载到另一个线程,然后只发布重要的东西。一个常见的模仿是,通过在处理程序中发布,您在另一个线程中运行,但事实并非如此。在另一个线程中进行处理并仅回发操作UI的部分:(包括一些算法更改,如果不清楚或我完全搞砸了,请告诉我:))
private void startWork() {
new Thread(doWork).start();
}
Runnable doWork = new Runnable() {
while (true) { // alter this condition to meet your needs
for(int j=0;j<darkBlue.length;j++){
String subText = mac.getText().toString();
int length = darkBlue[j].length();
int sub = subText.indexOf(darkBlue[j]);
int index = 0;
while(sub > 0){)
index += (sub + length);
colorSpan(Color.Blue, (index - length), index);
allText = allText.substring(sub + length);
sub = subText.indexOf(darkBlue[j]);
}
}
try {
Thread.sleep(1000);
}
catch (InterruptedException e) {
}
}
}
private void colorSpan(Color color, final int start, final int stop) {
handler.post(new Runnable() {
public void run() {
String allText = mac.getText().toString();
Spannable WordtoSpan = new SpannableString(allText);
WordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), start, stop, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mac.setText(WordtoSpan);
mac.setSelection(mac.getText().length());
}
});
}
注意:我这样做有点匆忙,请原谅我是否有任何明显的错误