使EditText接受一系列值而无需后验证

时间:2017-01-06 12:12:02

标签: java android xml

有没有办法只允许动态在EditText中输入数字xy

I.E甚至不允许输入低于x或高于y的数字? 例如x = 1 y = 12

当然,用户点击提交后,我可以用Java解决这个问题,并提示他们再次输入。但是浪费时间。

类似于android:digits="01234...",但能够指定n-th个字段。

例如

  • 范围从1到12

用户不应该因输入月份而感到困惑。

我已经在使用android:maxLength="2",但我需要更好的控制。

5 个答案:

答案 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并将代码放在那里。

另外,从它看起来你想要的东西检查输入正在输入,我真的不知道是否可能设置范围,更不用说它可能会导致应用程序滞后。正如其他人所建议的那样,输入后的验证是合乎逻辑的路径。

enter image description here

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>