Android TextWatcher不起作用
以下代码段用于文本观察程序…它不工作…一切正常,直到最后一行代码Android TextWatcher不起作用,android,textwatcher,Android,Textwatcher,以下代码段用于文本观察程序…它不工作…一切正常,直到最后一行代码 private TextWatcher mobileTextWatcher = new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextC
private TextWatcher mobileTextWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
String number = s.toString();
number = AppConstants.convertToOnlyDigits(number);
Editable temp = new SpannableStringBuilder(
AppConstants.formatPhoneNumber(number));
s = temp;
}
};
之后,新的不被分配给s。。或者换句话说,我在编辑文本中看不到文本的更改。因为
s
是函数参数,您不能重新分配它并保存超出函数范围的新值
如果我正确理解您的目标-您应该通过
setText()
方法将temp值分配给EditText
,参数不作为引用传递,因此s=temp;不会更改edittext中的文本
像这样试试
private TextWatcher mobileTextWatcher = new TextWatcher() {
boolean inWatcher = false;
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,int after) {
}
@Override
public void afterTextChanged(Editable s) {
if(inWatcher) { inWatcher = false; return; }
String number = s.toString();
number = AppConstants.convertToOnlyDigits(number);
Editable temp = new SpannableStringBuilder(AppConstants.formatPhoneNumber(number));
inWatcher = true;
your_edit_text.setText(temp);
}
};
您必须使用setText()方法再次设置EditText的文本
在执行此操作之前,您可能希望添加一个简单的布尔检查作为“mFormatting”,以确保在进行更改后不会进入textWatcher调用自身的无限循环 您没有更改
s
中的对象,而是用另一个对象替换变量s
试着这样做:
boolean recurseProtection = false;
@Override
public void afterTextChanged(Editable s) {
if(!recurseProtection) {
String number = s.toString();
number = AppConstants.convertToOnlyDigits(number);
recurseProtection = true;
s.clear();
s.append(AppConstants.formatPhoneNumber(number));
recurseProtection = false;
}
}
注意,我添加了一些保护,以防止在更改s
对象时调用posterextchanged
(我假设该对象上放置了一个DataObserver)。递归保护已经超出了我的想象,因此可能需要调整
希望这会有帮助。但这会导致无限循环…s.replace()是否可以达到目的?它工作正常…我的不好…请编辑您的答案,以便我可以投票