TextWatcher未检测到删除键

时间:2018-08-11 03:07:00

标签: java android android-edittext textwatcher

我有一个TextWatcher,它在EditText中的数字后放置一个百分号。那部分工作正常。问题是如果用户犯了一个错误并且需要删除editText中的数字,则百分号不允许进行任何删除。下面是我的代码:

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

    }

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

@Override
public void afterTextChanged(Editable s) {


    editText.removeTextChangedListener(this);

        try {
            String originalString = s.toString();

            if (originalString.contains("%")) {
                originalString = originalString.replaceAll("%", "");

            }

            String formattedString = originalString + "%";

            //setting text after format to EditText
            editText.setText(formattedString);
            editText.setSelection(editText.getText().length());

        } catch (NumberFormatException nfe) {
            nfe.printStackTrace();
        }


    editText.addTextChangedListener(this);


}

我相信我需要一个OnKeyListener,但不确切地知道如何实现它。这是我对OnKeyListener所做的,但是它不起作用:

boolean keyDelete

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

}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {

}

@Override
public void afterTextChanged(Editable s) {

    if(!keyDelete) {

        editText.removeTextChangedListener(this);

        try {
            String originalString = s.toString();

            if (originalString.contains("%")) {
                originalString = originalString.replaceAll("%", "");

            }

            String formattedString = originalString + "%";

            //setting text after format to EditText
                editText.setText(formattedString);
                editText.setSelection(editText.getText().length());

            } catch (NumberFormatException nfe) {
                nfe.printStackTrace();
            }

            editText.addTextChangedListener(this);
        }

    }

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {

        if (keyCode == KeyEvent.KEYCODE_DEL){
            keyDelete = true;
        }else{
            keyDelete = false;
        }
        return false;
    }

对此有任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果用户将光标置于'%'符号之前,则您的代码可以正常工作。问题是在格式化文本后,您将选择设置为文本的结尾。

editText.setSelection(editText.getText().length());

在某些情况下,当用户按下删除按钮而不替换光标时,他正在删除'%'符号,但是您的代码每次都返回'%'符号。这是因为感觉像:

  

百分号不允许任何删除

要解决您的问题,请将代码重构为在“%”符号前设置选择项:

@Override
public void afterTextChanged(Editable s) {
    editText.removeTextChangedListener(this);

    try {
        String originalString = s.toString();

        if (originalString.contains("%")) {
            originalString = originalString.replaceAll("%", "");

        }

        String formattedString = originalString + "%";

        //setting text after format to EditText
        editText.setText(formattedString);
        if (formattedString.length() >= 1) {
            editText.setSelection(editText.getText().length() - 1);
        }

    } catch (NumberFormatException nfe) {
        nfe.printStackTrace();
    }


    editText.addTextChangedListener(this);
}