You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android中如何限制EditText输入数字,允许特殊字符与字母?

如何限制EditText禁止输入数字但允许字母和特殊字符?

嘿,我懂你要的效果——就是让EditText完全拒绝0-9的数字输入,但字母、各种特殊符号都能正常输入对吧?找了一圈没找到合适的方案,那我给你分享两个实用的实现方法:

方法一:自定义InputFilter(最灵活的方式)

InputFilter是Android里用来过滤输入内容的利器,我们可以自己写一个过滤器,把所有数字都过滤掉:

Kotlin版本

class NoDigitsInputFilter : InputFilter {
    override fun filter(
        source: CharSequence?,
        start: Int,
        end: Int,
        dest: Spanned?,
        dstart: Int,
        dend: Int
    ): CharSequence? {
        // 只保留非数字的字符
        val filteredContent = source?.filterNot { it.isDigit() } ?: ""
        // 如果过滤后的内容和原输入一样,就返回null(表示允许输入),否则返回过滤后的内容
        return if (filteredContent == source) null else filteredContent
    }
}

Java版本

public class NoDigitsInputFilter implements InputFilter {
    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        StringBuilder filtered = new StringBuilder();
        for (int i = start; i < end; i++) {
            char c = source.charAt(i);
            // 只添加非数字的字符
            if (!Character.isDigit(c)) {
                filtered.append(c);
            }
        }
        // 如果没有过滤掉任何内容,返回null允许输入;否则返回过滤后的结果
        return filtered.length() == end - start ? null : filtered;
    }
}

然后在你的Activity/Fragment里给EditText设置这个过滤器:

Kotlin

val countryEt = findViewById<EditText>(R.id.country)
countryEt.filters = arrayOf(NoDigitsInputFilter())

Java

EditText countryEt = findViewById(R.id.country);
countryEt.setFilters(new InputFilter[]{new NoDigitsInputFilter()});

方法二:用正则表达式快速实现(更简洁)

如果不想单独写一个类,也可以用正则表达式直接替换掉输入中的数字,写法更简洁:

Kotlin版本

val noDigitsFilter = InputFilter { source, _, _, _, _, _ ->
    // 把输入中的所有数字替换为空字符串
    source.replace(Regex("\\d"), "")
}

val countryEt = findViewById<EditText>(R.id.country)
countryEt.filters = arrayOf(noDigitsFilter)

Java版本

InputFilter noDigitsFilter = (source, start, end, dest, dstart, dend) -> {
    // 替换所有数字为空
    return source.toString().replaceAll("\\d", "");
};

EditText countryEt = findViewById(R.id.country);
countryEt.setFilters(new InputFilter[]{noDigitsFilter});

额外注意事项

  • 你布局里的inputType="textVisiblePassword|textNoSuggestions|text"完全没问题,这个类型允许输入所有字符(包括特殊符号),不需要修改,和我们的过滤器搭配刚好满足需求。
  • 如果EditText里已经有数字内容,设置过滤器后不会自动清除,要是需要初始化时清理已有数字,可以加这段代码:

Kotlin

val cleanText = countryEt.text.toString().replace(Regex("\\d"), "")
countryEt.setText(cleanText)

Java

String cleanText = countryEt.getText().toString().replaceAll("\\d", "");
countryEt.setText(cleanText);

内容的提问来源于stack exchange,提问作者Abhishek Mishra

火山引擎 最新活动