在我的Android应用程序中,我需要实现TextWatcher接口来实现onTextChanged
。我的问题是,我想用一些额外的字符串更新相同的EditText。当我尝试这样做时,程序终止。
final EditText ET = (EditText) findViewById(R.id.editText1);
ET.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
try
{
ET.setText("***"+ s.toString());
ET.setSelection(s.length());
}
catch(Exception e)
{
Log.v("State", e.getMessage());
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after)
{
}
@Override
public void afterTextChanged(Editable s)
{
}
});
我的程序终止,甚至我尝试捕获异常,就像在代码中一样,它仍然终止。
有谁知道为什么会发生这种情况以及我如何实现这一目标?谢谢。
最佳答案
TextView
事件的内容不可编辑。
相反,您需要处理onTextChanged
事件才能对文本进行更改。
有关更详尽的解释,请参见:Android TextWatcher.afterTextChanged vs TextWatcher.onTextChanged
注意:错误afterTextChanged
显然,通过不断更改onTextChanged
事件上的文本,您将导致无限循环。
从the ref:
公共抽象void afterTextChanged(Editable s)
调用此方法以通知您s内某处的文本已经
改变了。对此进行进一步更改是合理的
回调,但请注意不要陷入无限循环,
因为您所做的任何更改都会导致再次调用此方法
递归地...
afterTextChanged
是否已经是您想要的。@Override
public void afterTextChanged(Editable s)
{
if( !s.equalsIngoreCase("smth defined previously"))
s = "smth defined previously";
}
验证),您可以像thispost.
s
方法注2 :将输入格式化为部分隐藏的n个星,直到最后4个字符(**** 4)
您可以在建议1中使用类似的方法:
@Override
public void afterTextChanged(Editable s)
{
String sText = ET.getText().toString()
if( !isFormatted(sText))
s = format(sText);
}
bool isFormatted(String s)
{
//check if s is already formatted
}
string format(String s)
{
//format s & return
}