【问题标题】:Stop EditText scrolling when changing text (Android)更改文本时停止 EditText 滚动(Android)
【发布时间】:2011-11-11 04:06:58
【问题描述】:

我正在尝试为 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);
        }
    }
}

【问题讨论】:

    标签: android syntax scroll android-edittext highlighting


    【解决方案1】:

    另外,有一个方法叫做setTextKeepState(CharSequence text)。见TextView docs.

    【讨论】:

      【解决方案2】:

      我建议如下:

      protected void onPostExecute(SpannableString HighlightedString) {
          int i = textSource.getSelectionStart();
          textSource.setText(HighlightedString, BufferType.SPANNABLE);
          textSource.setSelection(i);
      }
      

      在更改内容后将光标放回原位。

      【讨论】:

      • 谢谢,太棒了!只是说它是 textSource.getSelectionStart(),而不是 getSelection()。谢谢!
      猜你喜欢
      • 2011-12-29
      • 1970-01-01
      • 2020-11-13
      • 2011-09-04
      • 2021-05-09
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 2014-10-19
      相关资源
      最近更新 更多