android限制字符数区分中文英文,Android限制只能输入英文和中文

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

前言

在实际的开发当中,如果有一个需求是:输入框中只能输入中文或者是英文亦或者是中英混合

如果是纯英文,长度限制是12,其他情况限制为6。分析当你看完上面的需求时,是不是有种想法想提刀斬需求方? WTF !

大胸弟,莫鸡冻。

我们先想想,有神码方法是可以限制输入框上输入的呢?哎,好像有个叫inputType的属性哦。。。可是翻遍了所有的属性,都没有我们所需要的啊 !1android:inputType="text|textCapWords|number|textPassword|..."

好吧,既然没有,在看看有没有其他的属性咯.1android:digits="0123456789"

这个属性,好像是可以的 ? 但是这个属性是只允许输入的是digits里面所定义的所有规则 , 如果我要输入的是中英文 , 要怎样去写里面的规则呢 ? 很明显这个属性里面的值是不支持正则表达式的,所有无法完成。

有人会说 , 不能在用户输入内容后再在处理时判断吗 ? Are you kidding me ? 你做不好事情 , 到时候可能就是需求方找你麻烦了.不过又给了你一个接触他kan他的机会了, 珍重 !做法

有的人说 , 用TextWatcher来监听输入 , 然后判断是否是需要的 , 不需要的就用空的字符串替换掉 , 然后把光标移动到相应的位置 , 这种方式有兴趣的朋友可以试试 .

下面我说说我的做法 :

其实google大佬是很聪明的啦 , 神码都为我们想好了 , EditText 中有个方式是1(InputFilter[] InputFilter)

我们可以用这个方法做很多事情的 , 比如上面所说的限制只能输入中英文 .

首先定义一个InputFilter1

2

3

4

5

6

7

8

9InputFilter typeFilter = new InputFilter() {

@Override

public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {

Pattern p = Pattern.compile("[a-zA-Z|u4e00-u9fa5]+");

Matcher m = p.matcher(source.toString());

if (!m.matches()) return "";

return null;

}

};

里面的内容也是一看就能明白的 , 其中如果需要输入该字符串的话就返回null , 如果要过滤掉(不要)的话就返回空字符串 .

然后再设置 :1editText.setFilters(new InputFilter[]{typeFilter});

注意

这里有个注意的地方是 , 如果设置了inputFilter , 那么在布局中设置的maxLength属性就会失效 , 那么怎样去限制它的长度呢 ?

如果是统一的长度的话 , 直接设置即可 .1editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(length)});

如果想需求中的根据每种情况设置不同的长度限制怎么办 ? 那就自己写呗 .1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53private static class SizeFilterWithTextAndLetter implements InputFilter {

private int mMaxLength;

private int onlyLetterLength;

private int normalLength;

private boolean hasChinese;

Pattern p = Pattern.compile("[u4e00-u9fa5]+");

Matcher m;

private SizeFilterWithTextAndLetter(int onlyLetterLength,int normalLength) {

this.normalLength = normalLength;

this.onlyLetterLength = onlyLetterLength;

}

@Override

public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {

if (!hasChinese && dest.length() <= normalLength) {

if (dest.length() >= normalLength) {

m = p.matcher(dest.toString());

} else {

String tmp = source.toString() + dest.toString();

if (tmp.length() >= normalLength) {

tmp = tmp.substring(0,normalLength);

}

m = p.matcher(tmp);

}

hasChinese = m.find();

mMaxLength = hasChinese ? normalLength : onlyLetterLength;

}

if (mMaxLength == onlyLetterLength) {

m = p.matcher(source);

if (m.find()) return "";

}

int keep = mMaxLength - (dest.length() - (dend - dstart));

if (keep <= 0) {

return "";

} else if (keep >= end - start) {

return null;

} else {

keep += start;

if (Character.isHighSurrogate(source.charAt(keep - 1))) {

--keep;

if (keep == start) {

return "";

}

}

return source.subSequence(start, keep);

}

}

}

然后1editText.setFilters(new InputFilter[]{new SizeFilterWithTextAndLetter(12,6)});

大功告成 !!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值