5

我使用 TextWatcher 来更改按下的键值。我的目标是在打字时替换一些字符。例如,当我键入键时,如果达到“S”字符,则将其替换为“a”字符。我的问题是:我应该在 beforeTextChanged 中做吗?如何?谁能给我一个例子?

4

4 回答 4

11

我知道这篇文章已经有几年的历史了,但是两个版本都不适合我,并且在两个答案之间建立了一个混合体。

@Override
public void afterTextChanged(Editable editable) {    
    if (editable.toString().contains(",")) {
       Editable ab = new SpannableStringBuilder(editable.toString().replace(",", ""));
       editable.replace(0, editable.length(), ab);
    }
}
于 2016-04-26T08:38:20.427 回答
1

使用 beforeTextChanged 不会有用,因为它不会中断 EditText 键的实际打印。我会使用类似的东西:

    public void afterTextChanged(Editable s) {
        if(s.length() > 0 && s.toString().charAt(s.length()-1) == 'S')
        {
            final String newText = s.toString().substring(0, s.length()-1) + "a"; 
            editText.setText(newText); 
        }
    }

我添加了一些 toString(),不是 100% 确定 Editable 是如何工作的,但我认为应该涵盖它。

于 2013-03-27T07:36:44.560 回答
1

您必须在 中执行此操作afterTextChanged,但不要忘记分离重新附加TextChangedListener防止无限循环。
一个简单的例子如下所示:

public void afterTextChanged(Editable s) {
        editText.removeTextChangedListener(this);
        //.. do changes here ..//
        editText.setText(newText);
        editText.addTextChangedListener(this);
}

但是当你调用 时还有另一个问题setText,它会导致光标移动到 textView 内文本的末尾。所以你必须自己计算光标的新位置,记住用户可以通过粘贴或删除文本的选定部分来一次输入多个字符。
这是一个更完整的例子。此观察程序类删除文本的所有非数字字符。

public class NumWatcher implements TextWatcher {
    private EditText editText;
    private int selPos;
    private String oldString, newString;
    public NumWatcher(EditText editText) {
        this.editText = editText;
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        selPos = editText.getSelectionStart();
        oldString = myFilter(s.toString());
    }

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

    @Override
    public void afterTextChanged(Editable s) {
        editText.removeTextChangedListener(this);
        newString = myFilter(s.toString());
        editText.setText(newString);
        int newPos = selPos + (newString.length() - oldString.length());
        if (newPos < 0) newPos = 0;
        editText.setSelection(newPos);
        editText.addTextChangedListener(this);
    }

    public String myFilter(String s) {
        String digits;
        digits = s.replaceAll("[^0-9]", "");
        if (s.equals("")) return "";
        return digits;
    }
}
于 2019-02-25T12:36:41.927 回答
-2
@Override
public void afterTextChanged(Editable arg0) {
    Editable ab = new SpannableStringBuilder(arg0.toString().replace("S", "a"));
    arg0 = ab ;
}
于 2013-03-27T08:26:48.437 回答