Android:如何通过其他InputFilter编程设置EditText的最大长度?

88

我正在使用以下这个 InputFilter,以允许只输入字母和数字

private InputFilter[] inputFilters = new InputFilter[] { new InputFilter()
{
    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend)
    {
        for (int i = start; i < end; ++i)
        {
            if (!Pattern.compile("[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890]*").matcher(String.valueOf(source.charAt(i))).matches())
            {
                return "";
            }
        }

        return null;
    }
} };

但问题是xml文件中的"android:maxLength"值与此InputFilter不兼容。

我认为我需要在InputFilter中编写代码来设置EditText的最大长度。

有没有人对此有好的想法?

谢谢。

10个回答

152
一个简单的一行代码会是:

Java:

myEditText.setFilters(new InputFilter[] { new InputFilter.LengthFilter(10) });

Kotlin:

Kotlin:
myEditText.filters = arrayOf(InputFilter.LengthFilter(10))

这很简单,我觉得它应该得到最高票数...加油! - Sujay U N
有没有一种编程方式可以运行它? - davidm
这非常简单高效。 - undefined

63
public void setEditTextMaxLength(int length) {
    InputFilter[] filterArray = new InputFilter[1];
    filterArray[0] = new InputFilter.LengthFilter(length);
    edt_text.setFilters(filterArray);
}

2
很好的回答,Deepak。这里需要注意一点:如果用户在达到限制后继续输入,它会被存储到缓冲区中,因此编辑文本建议会越来越大。 - Akeshwar Jha
1
@shridutt-kothari 你为什么编辑了答案?你把它改成了我的版本。请把它恢复到原来的样子。 - Ray Hunter
@Akeshwar,我们正在定义过滤器的长度,它不应该溢出。 - Deepak

47

For Kotlin

myEditText.filters = arrayOf(InputFilter.LengthFilter(maxLength))

在 Kotlin 中对我来说它完美地工作,非常感谢。 - Shadros

44

请尝试这种方法

InputFilter 输入过滤器

InputFilter filter = new InputFilter() {
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            for (int i = start; i < end; ++i)
            {
                if (!Pattern.compile("[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890]*").matcher(String.valueOf(source.charAt(i))).matches())
                {
                    return "";
                }
            }

            return null;
        }
    };

如何申请

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EditText edt =(EditText)findViewById(R.id.edt) ;

        edt.setFilters(new InputFilter[]{filter,new InputFilter.LengthFilter(10)});


    }

12

如果我们想要限制在EditText中输入的字符数,XML布局中的EditText提供了android:maxLength来实现。但在Java代码中,您可能会想知道为什么没有setMaxLength(int length)函数。原因是当您想要限制EditText接受特定值时,必须对其进行过滤,这将由setFilters调用。为了使我们的EditText具有固定大小,我们可以使用以下代码。

EditText et = new EditText(this);
int maxLength = 3;
InputFilter[] FilterArray = new InputFilter[1];
FilterArray[0] = new InputFilter.LengthFilter(maxLength);
et.setFilters(FilterArray);

1
好的答案需要有解释,而不仅仅是简单的复制粘贴解决方案。干杯! - sud007
1
非常感谢您解释为什么需要使用setFilters。 - Eman

8

在@Deepak的基础上,我使用了以下内容:

public void setEditTextMaxLength(final EditText editText, int length) {
    InputFilter[] FilterArray = new InputFilter[1];
    FilterArray[0] = new InputFilter.LengthFilter(length);
    editText.setFilters(FilterArray);
}

7
et.filters = arrayOf<InputFilter>(InputFilter.LengthFilter(20))

in kotlin


1
请编辑您的答案并提供解释。在 Stack Overflow 上,这总是有用的。但在这里,尤其有用,因为已经有九个现有答案。您的答案有何不同之处?在什么情况下会优先考虑您的答案而不是现有的方法?请记住,每个新答案都会增加一个需要评估此问题的人的帖子。让他们更容易理解差异以及为什么应该考虑您的代码而不是其他人的代码。 - Jeremy Caney

6

在Kotlin中

textInputEditText.filters = arrayOf(InputFilter.LengthFilter(10))

2
你可以非常轻松地使用这个函数:

最初的回答:

 public static void setEditTextMaxLength(EditText editText, int length) {
    InputFilter[] FilterArray = new InputFilter[1];
    FilterArray[0] = new InputFilter.LengthFilter(length);
    editText.setFilters(FilterArray);
  }

and use this on your activity:

setEditTextMaxLength(edt_passcode, 5);

2
请使用这个方法:
private void setEditTextMaxLength(EditText et, int maxLength) {
    et.setFilters(new InputFilter[]{new InputFilter.LengthFilter(maxLength)});
}

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