afterTextChanged()中的setText()以相反的顺序显示文本

时间:2016-03-03 12:05:36

标签: android android-edittext

我的代码:

    fractionNumEt.addTextChangedListener(new TextWatcher() {

        boolean ignoreChange = false;

        @Override
        public void afterTextChanged(Editable s) {
            if(!ignoreChange) {
                String string = String.valueOf(s);
                if (string.length() > 2) {
                    string = string.substring(0, string.length() - 1);
                    ignoreChange = true;
                    fractionNumEt.setText(string);
                    ignoreChange = false;
                }
            }

        }

...

我试图将字符限制为长度2,但是想继续听。当我输入'1','2'时,它显示“12”,这很好。现在当我键入'3'时,它写“31”而不是“23”。 到底是怎么回事! 我也尝试过:

string = string.substring(1, string.length());

在这种情况下,它首次使用n然后没有任何改变。

1 个答案:

答案 0 :(得分:2)

这种情况正在发生,因为在setText()之后,EditText的光标返回到第一个位置。然后,在字符串的前面添加任何新的数字。

尝试更新您的代码,如下所示:

@Override
public void afterTextChanged(Editable s) {
    if(!ignoreChange) {
        String string = String.valueOf(s);
        if (string.length() > 2) {
            string = string.substring(0, string.length() - 1);
            ignoreChange = true;
            fractionNumEt.setText(string);
            fractionNumEt.setSelection(fractionNumEt.getText().length());
            ignoreChange = false;
        }
    }
}

只是一个建议

检查可修改的文档HERE

我认为您不需要将其转换为String。 afterTextChanged(Editable s)收到Editable as参数。您可以直接更改它。不需要将其转换为String。

此外:您甚至不需要创建EditText.setText(),因为可编辑的任何更改都会自动传递给EditText(因为afterTextChanged是由android调用的,所以给你机会在文本片刻之前更新文本,以便在EditText中有效地显示该文本。

也许,就像那样:

@Override
public void afterTextChanged(Editable s) {
    if(!ignoreChange) {
        if(s.length() > 2) {
            s.delete(s.length() - 1,s.length());
        }
    }
}

使用可编辑播放一点,您会发现它更容易。