我正在尝试为Android编写语法突出显示程序.在单独的AsyncTask线程中运行的突出显示算法效果很好,并返回具有所有必需格式的SpannableString.
但是,每当我执行editText.setText(mySpannableString,BufferType.SPANNABLE)以显示突出显示的文本时,EditText就会滚动回到开头并选择该文本的开头.
显然,这意味着当语法荧光笔正在处理文本时,用户无法继续键入.我该如何阻止呢?有什么方法可以在不滚动EditText的情况下更新文本?这是代码的概述:
public class SyntaxHighlighter extends Activity {
private EditText textSource;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.editor);
textSource = (EditText) findViewById(R.id.codeSource);
// Syntax Highlighter loaded text
new XMLHighlighter().execute(textSource.getText().toString());
}
// Runs on Asyncronous Task
private class XMLHighlighter extends AsyncTask<String, Void, SpannableString> {
protected SpannableString doInBackground(String... params) {
return XMLProcessor.HighlightXML(params[0]);
}
protected void onPostExecute(SpannableString HighlightedString) {
textSource.setText(HighlightedString, BufferType.SPANNABLE);
}
}
}
解决方法:
我建议以下内容:
protected void onPostExecute(SpannableString HighlightedString) {
int i = textSource.getSelectionStart();
textSource.setText(HighlightedString, BufferType.SPANNABLE);
textSource.setSelection(i);
}
在更改内容后将光标放回其位置.