使用setText时,TextWatcher会变慢

时间:2015-02-15 04:07:26

标签: android

我使用TextWatcher修改EditText,使其始终显示为#tag1 #tag2...

这是我的代码:

    editHashtags.addTextChangedListener(new TextWatcher() {
        private boolean lock = false;
        private String toGo;

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if(before == 1) return;

            toGo = s.toString();

            if(toGo.charAt(0) != '#') {
                toGo = '#' + toGo;
            }

            if(toGo.charAt(start) == ' ' && toGo.charAt(start - 1) == '#' && start > 0
            || toGo.charAt(start) == ' ' && toGo.charAt(start - 1) == ' ' && start > 0) {
                toGo = toGo.substring(0, toGo.length() - 1);
            } else if(toGo.charAt(start) == ' ') {
                toGo += '#';
            } else if(toGo.charAt(start) != '#' && toGo.charAt(start - 1) == ' ') {
                toGo = toGo.substring(0, toGo.length() - 1) + '#' + toGo.charAt(start);
            }
        }

        @Override
        public void afterTextChanged(Editable s) {
            if(lock) return;

            toGo = toGo.replaceAll("#+", "#");

            lock = true;
            editHashtags.setText(toGo);
            editHashtags.setSelection(toGo.length());
            lock = false;
        }
    });

问题是当我使用lock更改文本时。看起来setText真的很慢,所以如果我快速输入,会忽略一些字符。

解决此问题的最佳方法是什么?

谢谢。

2 个答案:

答案 0 :(得分:1)

使用EditText修改TextWatcher的正确方法是修改Editable方法上收到的可变对象afterTextChanged

答案 1 :(得分:0)

您还可以考虑实现自定义TransformationMethod,这可能会为您带来更好的效果。例如,类似于框架ReplacementTransformationMethod的实现。