有没有办法只允许动态在EditText中输入数字x
到y
?
I.E甚至不允许输入低于x
或高于y
的数字?
例如x = 1
y = 12
。
当然,用户点击提交后,我可以用Java解决这个问题,并提示他们再次输入。但是浪费时间。
类似于android:digits="01234..."
,但能够指定n-th
个字段。
例如
用户不应该因输入月份而感到困惑。
我已经在使用android:maxLength="2"
,但我需要更好的控制。
答案 0 :(得分:1)
无需在xml中执行任何操作。
在代码中找到EditText
:
int minValue = 1;
int maxValue = 12;
EditText input = (EditText) findViewById(R.id.txtInput);
input.setInputType(InputType.TYPE_CLASS_NUMBER);
input.setFilters(new InputFilter[]
{
new InputFilterMinMax(minValue, maxValue),
new InputFilter.LengthFilter(String.valueOf(maxValue).length())
});
input.setKeyListener(DigitsKeyListener.getInstance("0123456789"));
InputFilterMinMax
的代码:
public class InputFilterMinMax implements InputFilter {
private int min, max;
public InputFilterMinMax(int min, int max) {
this.min = min;
this.max = max;
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
try {
int input = Integer.parseInt(dest.toString() + source.toString());
if (isInRange(min, max, input))
return null;
} catch (NumberFormatException nfe) {
nfe.printStackTrace();
}
return "";
}
private boolean isInRange(int a, int b, int c) {
return b > a ? c >= a && c <= b : c >= b && c <= a;
}
}
希望能帮到你!
答案 1 :(得分:0)
我建议您在输入后仍然进行验证。这很简单 如果您将自己置于最终用户位置,那就是合乎逻辑的。用户会尝试 点击“99”,但你不允许第二个数字超过5.是 你计划以某种方式编辑他们的软键盘只显示 键盘中的某些数字?这更令人困惑和时间 耗时。写入警告/指令信息也是如此 uppon用户尝试写入无效数字(=在这种情况下,无论如何你都要在后台进行验证。
检查此SO答案以访问int:
中的某些数字并且uppon条目只检查第二个数字,因此您允许第一个数字来自1-9(这就是全部)。
if(secondDigit > 5){
// Warn the user of incorrect input
}
答案 2 :(得分:0)
您可以使用 Textwatcher 。
请看下面的代码。在 onTextChanged 中,您可以输入输入的字符和输入的字符数。
TextWatcher textwatcher = getMandatoryTextWatcher(editText);
String text = editText.getText().toString();//At this point String text is not empty.
editText.addTextChangedListener(textwatcher);
public TextWatcher getMandatoryTextWatcher(final EditText editText) {
TextWatcher textwatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
//To change body of implemented methods use File | Settings | File Templates.
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//To change body of implemented methods use File | Settings | File Templates.
}
@Override
public void afterTextChanged(Editable s) {
try {
//The first time this is called(the first softkey backspace press),
//text is empty. This causes a weird issue where the character that
//was just removed by pressing the backspace, reappears again.
//This is only the first time.
String text = editText.getText().toString();
if (text.length() <= 0) {
editText.setError(errorMandatory);
} else if (text.length() > 0) {
editText.setError(null);
} else {
editText.setError(errorMelding);
}
} catch (NumberFormatException nfe) {
editText.setError(errorMeldingTijdensParsen);
}
}
};
return textwatcher;
}
你可以使用这样的东西。
希望这能帮助你。
答案 3 :(得分:0)
如果您的范围较短并且您不需要double
个号码,我建议您使用spinner
来选择号码。
答案 4 :(得分:0)
它有点粗糙(考虑到我写得很快),但可以做这样的事情。我会删除onClick
方法并创建OnFocusChangeListener
并将代码放在那里。
另外,从它看起来你想要的东西检查输入正在输入,我真的不知道是否可能设置范围,更不用说它可能会导致应用程序滞后。正如其他人所建议的那样,输入后的验证是合乎逻辑的路径。
public void ValidateInputClick(View view) {
int Min = 1;
int Max = 12;
final TextInputLayout EditTextIP = (TextInputLayout) findViewById(R.id.layoutInput);
String str = EditTextIP.getEditText().getText().toString();
if (str.equals("") || str.contains("\n")) {
EditTextIP.setError("Cannot be blank");
EditTextIP.setErrorEnabled(true);
}
else {
int inputToInt = Integer.parseInt(str);
if (inputToInt >= Min && inputToInt <= Max) {
//Show number
Snackbar.make(view, str, Snackbar.LENGTH_SHORT).show();
EditTextIP.setErrorEnabled(false);
} else {
//Clear text
EditTextIP.getEditText().setText("");
//Show Error
EditTextIP.setError("Number must be between 1-12");
EditTextIP.setErrorEnabled(true);
}
}
}
XML:
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/layoutInput">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/editText1"
android:hint="Please enter a number between 1 and 12"
android:maxLength="2"
android:onClick="ValidateInputClick"/>
</android.support.design.widget.TextInputLayout>