将EditText过滤器设置为自定义范围内的数字

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将EditText过滤器设置为自定义范围内的数字相关的知识,希望对你有一定的参考价值。

我正在寻找一种方法来限制我输入EditText字段的数字,但我遇到了一些障碍。

我已经彻底研究过我的问题的解决方案,我将在下面详细说明。

我想创建4个不同的EditText字段,其中每个字段都接受以下范围:(1,24); (80,200); (1,999); (40,70)。

为简单起见,这些不是小数(或双精度/浮点数/长整数),而只是整数。

我已经研究了以下链接提供的解决方案,并提供了它们的缺点。

Android: Limiting EditText to numbers此解决方案仅告诉我如何将输入的文本限制为仅数字数据。它不提供范围。

Is there a way to define a min and max value for EditText in Android?已接受的解决方案确实完成了设置范围的目标,但问题在于它仅适用于范围(1,24)和(1,999),因为它的实现。问题是,如果我在间隔(40,70)或(80,200)中查找值,我将从一次输入一个数字开始,因此这不起作用。它将拒绝单个数字输入,这使其非用户友好。

How to limit the text in numbers only from 0-59 in Edit Text in Android?我相信这里接受的解决方案与上面的解决方案有同样的问题,因为它一次只需要一位数。我考虑在afterTextChanged下使用相同的方法而不是onTextChanged,但无济于事。

Number range on an edittext - only want numbers between 1 and 10此解决方案涉及按钮单击以评估该数字是否落在给定范围内,因此这将被视为“事后”解决方案。我需要一个EditText来实时拒绝用户的输入。

非常感谢您的帮助,可能有助于解决许多其他人显然遇到的问题(阅读评论,其他人似乎希望范围不以一位数开头/结尾)。

答案

使用Textwatcher,这里我有一个edittext,如果他输入1-24的数字,我允许用户

public class MainActivity extends AppCompatActivity {
EditText et;
    int num1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et= (EditText) findViewById(R.id.edit_text);
        et.addTextChangedListener(textWatcher);

    }
    TextWatcher textWatcher =new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if(et.getText().length()>0) {
                int num = Integer.parseInt(et.getText().toString());
                if (num>=1 && num<=24)
                {
                    //save the number
                    num1=num;
                }
                else{
                    Toast.makeText(MainActivity.this,"Please enter the code in the range of 1-24",Toast.LENGTH_SHORT).show();
                    et.setText("");
                    num1=-1;
                }
            }
            }

        @Override
        public void afterTextChanged(Editable s) {

        }
    };
}

这是xml文件

 <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/edit_text"
        android:inputType="number"
        />

最后不要忘记检查

if(num1==-1)
{
Toast.makeText(MainActivity.this,"Please fill all the fields",Toast.LENGTH_SHORT).show();
}
另一答案

我到目前为止找到的最佳答案是基于以下链接的解决方案,但它有一个缺点:(qa​​zxswpoi)

缺点是,一旦我们不再将输入插入EditText,值将由EditText框保留(而不是清除)。

我的(编辑)代码如下:

头等舱https://stackoverflow.com/a/28743065/5906258

InputFilterMax

和二等package test; import android.text.InputFilter; import android.text.Spanned; // more imports public class InputFilterMax implements InputFilter { private int max; private Context context; public InputFilterMax(Context con, int max) { this.max = max; this.context = con; } public InputFilterMax(Context con, String max) { this.max = Integer.parseInt(max); this.context = con; } @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { try { String replacement = source.subSequence(start, end).toString(); String newVal = dest.toString().substring(0, dstart) + replacement +dest.toString().substring(dend, dest.toString().length()); int input = Integer.parseInt(newVal); if (input<=max) return null; } catch (NumberFormatException nfe) { Toast.makeText(context, "Number not accepted! Must be below or equal to " + max, Toast.LENGTH_SHORT).show(); return null; } return ""; } }

OnFocusChangeListenerMin

然后在Activity中我使用以下代码来应用过滤器和监听器:

package test;

import android.text.TextUtils;
import android.view.View;
import android.view.View.OnFocusChangeListener;
// more imports

public class OnFocusChangeListenerMin implements OnFocusChangeListener {

private int min;
private Context context;

public OnFocusChangeListenerMin(Context con, int min) {
    this.min = min;
    this.context = con;
}

public OnFocusChangeListenerMin(Context con, String min) {
    this.min = Integer.parseInt(min);
    this.context = con;
}


@Override
public void onFocusChange(View v, boolean hasFocus) {
    if(!hasFocus) {
        String val = ((EditText)v).getText().toString();
        if(!TextUtils.isEmpty(val)){
            if(Integer.valueOf(val)<min){
                Toast.makeText(context, "Number not accepted! Must be above or equal to " + min, Toast.LENGTH_SHORT).show();
            }

        }
    }
}
}

如果有人可以帮我解决我遇到的最后一个问题,我将不胜感激。

另一答案

您可以尝试使用TextWatcher的afterTextChanged回调。看看我是如何实现它的。

timeEdit = (EditText)findViewById(R.id.query_time_frame);
timeEdit.setFilters(new InputFilter[]{new InputFilterMax(getApplicationContext(), 24)});        // max limit on time
timeEdit.setOnFocusChangeListener(new OnFocusChangeListenerMin(getApplicationContext(), 1));    // min limit on time

以上是关于将EditText过滤器设置为自定义范围内的数字的主要内容,如果未能解决你的问题,请参考以下文章

自定义小部件无法转换为自定义小部件

如何使用自定义列表视图在edittext过滤器中获取空间?可以使用简单的适配器吗?

报表项表达式只能引用同一分组范围或包含分组范围内的其他报表项

将一个范围内的数字转换为另一个范围内的数字[重复]

如何使用仅接受数字的输入范围创建 PasswordBox?

您如何将 EditText 键盘设置为仅包含 Android 上的数字?