我使用TextWatcher来更改按下的键值。我的目标是在打字时更换一些字符。例如,当我键入键时,如果达到“S”字符,则将其替换为“a”字符。我的问题是:我应该在beforeTextChanged吗?怎么样?谁能举个例子?
答案 0 :(得分:8)
我知道这篇文章已经有几年了,但是这两个版本对我来说都不起作用,并且在两个答案之间建立了一个混合。
@Override
public void afterTextChanged(Editable editable) {
if (editable.toString().contains(",")) {
Editable ab = new SpannableStringBuilder(editable.toString().replace(",", ""));
editable.replace(0, editable.length(), ab);
}
}
答案 1 :(得分:2)
使用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是如何工作的,但我认为应该覆盖它。
答案 2 :(得分:0)
您必须在afterTextChanged
中进行操作,但不要忘记 分离
并 reattach 来防止无限循环。
下面显示了一个简单的示例:
TextChangedListener
但是,当您调用public void afterTextChanged(Editable s) {
editText.removeTextChangedListener(this);
//.. do changes here ..//
editText.setText(newText);
editText.addTextChangedListener(this);
}
时,还有另一个问题,它将导致光标移动到textView内部文本的末尾。因此,您必须自己计算光标的新位置,请记住用户可以通过粘贴或删除文本的选定部分来一次输入多个字符。
这里是一个更完整的示例。该观察器类删除文本的所有非数字字符。
setText
答案 3 :(得分:-1)
@Override
public void afterTextChanged(Editable arg0) {
Editable ab = new SpannableStringBuilder(arg0.toString().replace("S", "a"));
arg0 = ab ;
}