首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在安卓系统中,有没有办法定义EditText的最小值和最大值?

在安卓系统中,有没有办法定义EditText的最小值和最大值?
EN

Stack Overflow用户
提问于 2013-01-08 18:06:14
回答 20查看 144.9K关注 0票数 152

我想为EditText定义一个最小值和最大值。

例如:如果任何人尝试在其中输入月值,则该值必须介于1-12之间。

我可以使用TextWatcher来实现,但我想知道是否有其他方法可以在布局文件或其他地方实现。

编辑:我不想限制字符数。我想限制它的值。例如,如果我限制month EditText w个字符,当我输入12时,它将接受它,但如果我输入22,它就不能在我输入时接受它。

EN

回答 20

Stack Overflow用户

发布于 2013-09-29 06:05:56

在Pratik的代码中有一个小错误。例如,如果值是10,并且您在开头添加1以使110,则filter函数会将新值视为101。

有关此问题的修复,请参阅以下内容:

代码语言:javascript
复制
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
    try {
        // Removes string that is to be replaced from destination
        // and adds the new string in.
        String newVal = dest.subSequence(0, dstart)
                // Note that below "toString()" is the only required:
                + source.subSequence(start, end).toString()
                + dest.subSequence(dend, dest.length());
        int input = Integer.parseInt(newVal);
        if (isInRange(min, max, input))
            return null;
    } catch (NumberFormatException nfe) { }
    return "";
}
票数 95
EN

Stack Overflow用户

发布于 2015-02-26 20:55:10

在我看到的@Patrik的解决方案和@Zac的添加中,提供的代码仍然有一个很大的问题:

如果为min==3,则无法键入以1或2开头的任何数字(例如: 15,23)

如果为min>=10,则不可能键入任何内容,因为每个数字都必须以1,2,3开头...

在我的理解中,我们不能通过简单地使用类InputFilterMinMax来达到EditText值的最小-最大限制,至少对于最小值不是这样,因为当用户输入一个正数时,值会增长,我们可以很容易地执行动态测试来检查它是否达到限制或超出范围并阻塞不符合的条目。测试最小值是另一回事,因为我们不能确定用户是否已经完成键入,因此不能决定是否应该阻止。

这并不完全是OP所要求的,但为了验证的目的,我在我的解决方案中结合了一个InputFilter来测试最大值,以及一个OnFocusChangeListener来在EditText失去焦点时重新测试最小值,假设用户已经完成了输入,如下所示:

代码语言:javascript
复制
package test;


import android.text.InputFilter;

import android.text.Spanned;

public class InputFilterMax implements InputFilter {

private int max;

public InputFilterMax(int max) {
    this.max = max;
}

public InputFilterMax(String max) {
    this.max = Integer.parseInt(max);
}

@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) { }   
//Maybe notify user that the value is not good      
return "";
}
}

OnFocusChangeListenerMin

代码语言:javascript
复制
package test;

import android.text.TextUtils;
import android.view.View;
import android.view.View.OnFocusChangeListener;

public class OnFocusChangeListenerMin implements OnFocusChangeListener {

private int min;

public OnFocusChangeListenerMin(int min) {
    this.min = min;
}

public OnFocusChangeListenerMin(String min) {
    this.min = Integer.parseInt(min);
}


@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){
                //Notify user that the value is not good
            }

        }
    }
}
}

然后在Activity中将InputFilterMaxOnFocusChangeListenerMin设置为EditText注意:在onFocusChangeListener中可以同时设置最小值和最大值。

代码语言:javascript
复制
mQteEditText.setOnFocusChangeListener( new OnFocusChangeListenerMin('20');
mQteEditText.setFilters(new InputFilter[]{new InputFilterMax(getActivity(),'50')});
票数 12
EN

Stack Overflow用户

发布于 2019-11-27 18:11:16

Kotlin (如果有人需要它)(使用Utilities)

代码语言:javascript
复制
class InputFilterMinMax: InputFilter {
    private var min:Int = 0
    private var max:Int = 0
    constructor(min:Int, max:Int) {
        this.min = min
        this.max = max
    }
    constructor(min:String, max:String) {
        this.min = Integer.parseInt(min)
        this.max = Integer.parseInt(max)
    }
    override fun filter(source:CharSequence, start:Int, end:Int, dest: Spanned, dstart:Int, dend:Int): CharSequence? {
        try
        {
            val input = Integer.parseInt(dest.toString() + source.toString())
            if (isInRange(min, max, input))
                return null
        }
        catch (nfe:NumberFormatException) {}
        return ""
    }
    private fun isInRange(a:Int, b:Int, c:Int):Boolean {
        return if (b > a) c in a..b else c in b..a
    }
}

然后在你的Kotlin类中使用这个

代码语言:javascript
复制
percentage_edit_text.filters = arrayOf(Utilities.InputFilterMinMax(1, 100))

此EditText允许从1到100。

然后在您的XML中使用它

代码语言:javascript
复制
android:inputType="number"
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14212518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档