将 EditText 的值设置为它自己的值,已修改 - 导致冻结
Setting an EditText's value to its own value, modified - causes to freeze
我正在尝试使用带有数字的 EditText,当用户键入数字时 - 将使用正则表达式模式自动添加逗号。
这是我试过的:
input.addTextChangedListener(new TextWatcher() {
...
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (input.getText().toString().length() >= 4)
input.setText(addComma(input.getText().toString()));
}
...
}
添加逗号(字符串):
public String addComma(String number) {
return number.replace(",", "").replaceAll("\B(?=(\d{3})+(?!\d))", ",");
}
输入 4 位数字时 - 一段时间后应用会死机并崩溃。
因为你的应用程序中有一个无限循环。当您设置 TextView
的文本时,您的文本会发生变化,因此会再次调用 onTextChanged
方法,导致文本再次发生变化,等等
您可以使用一些布尔值来测试文本是否已被编辑,并且仅在文本未被您的方法编辑时才调用它。
在您的 class 中创建一个字段:
private boolean justEdited = false;
并在您的侦听器中使用它:
input.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (input.getText().toString().length() >= 4 && !justEdited) {
justEdited = true;
input.setText(addComma(input.getText().toString()));
} else if (justEdited) {
justEdited = false;
}
}
}
我正在尝试使用带有数字的 EditText,当用户键入数字时 - 将使用正则表达式模式自动添加逗号。
这是我试过的:
input.addTextChangedListener(new TextWatcher() {
...
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (input.getText().toString().length() >= 4)
input.setText(addComma(input.getText().toString()));
}
...
}
添加逗号(字符串):
public String addComma(String number) {
return number.replace(",", "").replaceAll("\B(?=(\d{3})+(?!\d))", ",");
}
输入 4 位数字时 - 一段时间后应用会死机并崩溃。
因为你的应用程序中有一个无限循环。当您设置 TextView
的文本时,您的文本会发生变化,因此会再次调用 onTextChanged
方法,导致文本再次发生变化,等等
您可以使用一些布尔值来测试文本是否已被编辑,并且仅在文本未被您的方法编辑时才调用它。
在您的 class 中创建一个字段:
private boolean justEdited = false;
并在您的侦听器中使用它:
input.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (input.getText().toString().length() >= 4 && !justEdited) {
justEdited = true;
input.setText(addComma(input.getText().toString()));
} else if (justEdited) {
justEdited = false;
}
}
}