Android中限制EditText仅接受整数输入

5
我正在尝试对EditText应用某种验证。用户只能输入1到60之间的整数。我在想是否应该让他们随意输入,当他们离开EditText时检查内容,如果超出范围,则将值更改为默认值,比如0。
或者有没有一种方法限制键盘只允许输入整数?
更新: 我正在以编程方式完成所有操作。到目前为止,我已经通过实现以下内容来限制仅数字输入并最多具有2个字符。但是,我仍然无法限制值仅在0和60之间。
    editText.setInputType( InputType.TYPE_CLASS_NUMBER );
    InputFilter[] FilterArray = new InputFilter[1];
    FilterArray[0] = new InputFilter.LengthFilter(2);
    editText.setFilters(FilterArray);
3个回答

2
你可以使用 android.text.method.KeyListener 来替换当前输入为你所需的内容。
由于你不必更改所有键,因此可以像这样使用 addTextChangedListener(TextWatcher watcher) 方法:
EditText editT = (EditText) findViewById(R.id.your_id);
editT.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
    // TODO Auto-generated method stub
}

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    // TODO Auto-generated method stub
}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    // TODO Auto-generated method stub

});

使用它来检查您的输入是否超出了您所寻找的范围,您甚至可以通过在循环中进行检查来忽略键。

在XML中:

  • 如果您仅使用数字,请使用android:inputType="number"
  • 要限制位数为2,请包括android:maxLength="2"

1

如果你只限制于数字,你可以使用

EditText.addTextChangedListener

获取输入的值并验证其不超过60

您可以通过在布局xml文件中的EditText添加android:numeric="integer"来轻松允许仅数字输入

尽管值得一提的是,android:numeric="integer"现已被弃用


android:numeric="integer"非常好用,但不幸的是它已经被弃用了。 - Niki Romagnoli

1
我搞定了!我在网上搜索了很久,综合了一些东西才让它正常工作。 基本上它运行一个并行进程,当用户将焦点放在特定的编辑框上时,它将不断运行。它将设置一个过滤器,以便用户只能在第一个整数槽中输入0-5,但允许在第二个整数槽中输入0-9。这显然会给出0-59而不是1-60,但这正是你想要的秒数。 这段代码放在onCreate方法之前,放在你的类里面:
final InputFilter filter = new InputFilter() 
{
    public CharSequence filter(CharSequence source, int start, int end,
                Spanned dest, int dstart, int dent)
    {
        for (int i = start; i < end; i++)
        {
            if ((source.charAt(start) == "6".charAt(0)) || (source.charAt(start) == "7".charAt(0)) || (source.charAt(start) == "8".charAt(0))
                    || (source.charAt(start) == "9".charAt(0)) || (!Character.isDefined(source.charAt(i))) )                            
            {
                return "";
            }
        }
        return null;
    }
 };

private class FilterCheckerTask extends AsyncTask<Void, Void, Void>
{       
    @Override
    protected Void doInBackground(Void... params) 
    {           
        while(true)
        {               
            if (<EditText>.getText().toString().isEmpty())
            {
                Log.e("empty","empty");                 
                <EditText>.setFilters(new InputFilter[]{filter, new InputFilter.LengthFilter(2)});              
            }
            else if (<EditText>.getText().toString().charAt(0) >= "6".charAt(0))
            {
                Log.e("front num bad","greater than 5");
                <EditText>.setFilters(new InputFilter[]{filter, new InputFilter.LengthFilter(2)});
            }
            else 
            {
                Log.e("unfiltered", "unfiltered");
                <EditText>.setFilters(new InputFilter[]{new InputFilter.LengthFilter(2)});      
            }
            if (kicker)
            {
                return null;
            }
        }           
    }       
}

然后,在 onCreate 方法中:

    Time_sec.setOnFocusChangeListener(new OnFocusChangeListener() 
    {
        public void onFocusChange(View v, boolean hasFocus)
        {
            new FilterCheckerTask().execute();
            if(!hasFocus)
                    {kicker = !hasFocus;}                               

        }
    });

正如我在第一部分中所说的,这将使用户只能在您的编辑框中输入00到59之间的数字。我知道它看起来可能有点凌乱,在某些if语句中可能需要进行一些清理,但据我所知,它完美地工作,并且似乎不会减慢系统速度。希望这可以帮助您,如果不能,请留给未来的谷歌搜索者。

如果我只想在那里放置数字7,该怎么办? - Yuriy Vasylenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接