我正在尝试限制编辑文本以输入60到3600之间的数字。为此,我使用了TextWatcher。该应用程序被编程为用60替换任何小于60的数字,用3600替换任何大于3600的数字但是当应用程序运行时我给出一个少于60的数字作为输入它会自动用60替换该数字现在如果我试图删除这个数字和输入以及新的数字在我的位置我不能这样做。例如,首先我在编辑文本中输入3,因此它会自动将该数字转换为60.现在我决定删除60并输入一个新的数字,我不能这样做。所以有人请帮我解决这个问题。 Bellow是我用来限制编辑文本的代码。
etNumPicures.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {
try {
// Log.d("Percentage", "input: " + s);
if (Integer.parseInt(s.toString()) < 60) {
s.replace(0, s.length(), "60");
Toast.makeText(
getApplicationContext(),
"Please enter a number between 60 to 3600. Any number less then 60 will be replaced by 60",
Toast.LENGTH_LONG).show();
} else if (Integer.parseInt(s.toString()) > 3600) {
s.replace(0, s.length(), "3600");
Toast.makeText(
getApplicationContext(),
"Please enter a number between 0 to 6. Any number greater then 3600 will be replaced by 3600",
Toast.LENGTH_LONG).show();
}
}
catch (NumberFormatException nfe) {
}
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void onTextChanged(CharSequence s, int start, int before,
int count) {
}
});
答案 0 :(得分:4)
错误是合乎逻辑的:P当您输入数字4时,TextWatcher会将其转换为60.这里一切都很好。
BUT!如果您现在为了插入另一个而删除数字0,TextWatcher将在那里看到一个数字6并再次将其设置为60!
您需要在此处考虑不同的验证策略: - )
答案 1 :(得分:1)
目前你正在做的事情将永远无法正常工作,因为当你从60删除任何数字时,它将再次低于60,并将用60替换它。
因此建议您使用OnFocusChangeListener。示例代码如下:
etNumPicures.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus){
if (etNumPicures.getText() != null) {
try{
int i = Integer.valueOf(etNumPicures.getText().toString());
if (i < 60) {
etNumPicures.setText("60");
else if (i > 3600){
etNumPicures.setText("3600");
}
}catch (NumberFormatException e){
etNumPicures.setText("60");
}
}
}
}
});
此处hasFocus在视图具有焦点时为true,在视图失去焦点时为false。
答案 2 :(得分:0)
你可以试试;
s.clear();
s.insert(0,"60");
答案 3 :(得分:0)
我不确定你应该使用文本更改事件来做到这一点。当你试图离开编辑字段时,我建议尝试更换值(即你已完成编辑):
etNumPicures.setOnFocusChangeListener(new OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
if(!hasFocus) {
// Replace value if needed...
}
}
});