有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android仅将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) 个答案

  1. # 1 楼答案

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

    EditText.addTextChangedListener
    

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

    通过添加,您可以轻松地只允许数字 android:numeric="integer" 到布局xml文件中的EditText

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

  2. # 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,请包含^{
  3. # 3 楼答案

    我明白了!我一直在网上搜寻,把一些东西放在一起,让它发挥作用。 基本上,它所做的是运行一个并行进程,当用户关注特定的文本框时,该进程将持续运行。它将设置一个过滤器,以便用户只能在第一个整数槽中输入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语句中可能会被清理一点,但据我所知,它工作得绝对完美,似乎根本不会减慢系统的速度。希望这能帮助你,如果不能的话,还有未来的谷歌人