我正在尝试为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);
}
}
}
答案 0 :(得分:2)
或者,有一种名为setTextKeepState(CharSequence text)
的方法。见TextView docs.
答案 1 :(得分:1)
我建议如下:
protected void onPostExecute(SpannableString HighlightedString) {
int i = textSource.getSelectionStart();
textSource.setText(HighlightedString, BufferType.SPANNABLE);
textSource.setSelection(i);
}
在更改内容后将光标放回原位。