Edittext限制字符输入和属性介绍

46 篇文章 0 订阅

Edittext限制字符输入和属性介绍

一.这里先展示一个小例子:

让Edittext只能输入:192.168.1…//这种数字和小数点的符号,并且显示的虚拟键盘是数字的(一般左边都有小数点)
只要这样设置Edittext的布局就可以了

  <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content" 
            android:inputType="number"
            android:digits="123456789."//可以输入的字符
            />

上面inputType是设置显示虚拟键盘的样式,digits是限制输入的字符,这里如果没有digits,设置了inputType:number后只能输入数字!
这里我测试过了digits也可以添加中文或其他字符。

二.EditText限制输入字符的5种实现方式

1. 设置EditText的inputType属性,可以通过xml或者java文件来设置。

假如我要设置为显示密码的形式,可以像下面这样设置:

//在xml中, 
  android:inputType="textPassword"

在java文件中,可以用

Edittext.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

2. 设置EditText的android:digits 属性, 这种方式可以指出要支持的字符。

比如要限制只能输入数字和字母,可以这样:

        android:digits="0123456789abcdefghijklmnopqrstuvwxyz@#!."//不支持区间操作符~或-

3.使用TextWather监听EditText的字符变化, 当内容改变时删掉不想要的字符。

说白了就是用户可以随便按键盘,在代码里控制马上删掉非法字符。
PS: 常见的搜索功能输入框就是用TextWatcher监测关键词变化,然后查数据并显示出来了。
示例代码:只能输入字母或者数字, 如果要支持其它字符可以修改regEx正则表达式。

Edittext et = (EditText) findViewById(R.id.ev_password);

//Edittext有字符变化的回调监听
et.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        String editable = et.getText().toString();//获取Edittext上的字符串
        String regEx = "[^a-zA-Z0-9]";  //只能输入字母或数字
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(editable);
        String str = m.replaceAll("").trim();    //删掉不是字母或数字的字符,其实这里是将不符合要求的替换为""
        if(!editable.equals(str)){
            et.setText(str);  //设置EditText的字符
            et.setSelection(str.length()); //因为删除了字符,要重写设置新的光标所在位置
        }
    }

4.通过InputFilter来实现。实现InputFilter过滤器, 需要覆盖一个叫filter的方法。

     EditText et=findViewById(R.id.et);

        et.setFilters(new InputFilter[]{
                new InputFilter() {
                    @Override
                    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
                        String regex = "^[\u4E00-\u9FA5]+$";
                        boolean isChinese = Pattern.matches(regex, source.toString());
                        if (!Character.isLetterOrDigit(source.charAt(start)) || isChinese) {
                            return "";
                        }
                        return null;
                    }
                }

        });

上面这个方法也是能实现,设置Edittext只能输入数字和字母,但是具体原理,我也没怎么理解!
注意: IntentFilter是个数组, 也就是说可以写多个过滤条件InputFilter!
这里也给大家简单说一下正则表达式:

/^(\w|-|[\u4E00-\u9FA5])*$/
^ 以后面的为开头
$ 以前面的为结尾
\w 数字,字母,下划线,.
\u4E00-\u9FA5 中文
* 代表前面出现0次或多次
| 或者
所以整个的意思是匹配一个 数字,字母,下划线,-,.,中文组成的一个字串

上面如果要不能输入1和中文字符,那么这这样写:

  String regex = "^1|[\u4E00-\u9FA5]+$";//同理你要限制其他字符用“|”即可。

正则表达式的筛选条件字符串,并非都是要^开头,$结尾。
如果想详细理解一下正则表达式,可以看看我之前的一个博客:
http://blog.csdn.net/wenzhi20102321/article/details/52627482

5.使用EditText的InputConnection属性限制输入字符。

新建个类继承于EditText并覆盖onCreateInputConnection函数, 在xml里使用LimitText替换EditText。

public class LimitEditText extends EditText {
    public LimitEditText(Context context) {
        super(context);
    }

    public LimitEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public LimitEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    /**
     * 输入法
     * @param outAttrs
     * @return
     */
    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
        return new InnerInputConnecttion(super.onCreateInputConnection(outAttrs),
                false);
    }

    class InnerInputConnecttion extends InputConnectionWrapper implements InputConnection {

        public mInputConnecttion(InputConnection target, boolean mutable) {
            super(target, mutable);
        }

        /**
         * 对输入的内容进行拦截
         *
         * @param text
         * @param newCursorPosition
         * @return
         */
        @Override
        public boolean commitText(CharSequence text, int newCursorPosition) {
            // 只能输入字母或者数字
            if (!Character.isLetterOrDigit(charSequence.charAt(i)) || isChinese)  {
                return false;
            }
            return super.commitText(text, newCursorPosition);
        }

        @Override
        public boolean sendKeyEvent(KeyEvent event) {
            return super.sendKeyEvent(event);
        }

        @Override
        public boolean setSelection(int start, int end) {
            return super.setSelection(start, end);
        }
    }
}

在布局文件中使用自定义View记得添加包名!

三、顺便介绍一下xml的inputtype的值。

android:inputType=”none”
android:inputType=”text”
android:inputType=”textCapCharacters” 字母大写
android:inputType=”textCapWords” 首字母大写
android:inputType=”textCapSentences” 仅第一个字母大写
android:inputType=”textAutoCorrect” 自动完成
android:inputType=”textAutoComplete” 自动完成
android:inputType=”textMultiLine” 多行输入
android:inputType=”textImeMultiLine” 输入法多行(如果支持)
android:inputType=”textNoSuggestions” 不提示
android:inputType=”textUri” 网址
android:inputType=”textEmailAddress” 电子邮件地址
android:inputType=”textEmailSubject” 邮件主题
android:inputType=”textShortMessage” 短讯
android:inputType=”textLongMessage” 长信息
android:inputType=”textPersonName” 人名
android:inputType=”textPostalAddress” 地址
android:inputType=”textPassword” 密码
android:inputType=”textVisiblePassword” 可见密码
android:inputType=”textWebEditText” 作为网页表单的文本
android:inputType=”textFilter” 文本筛选过滤
android:inputType=”textPhonetic” 拼音输入

//数值类型
android:inputType=”number” 数字格式-->显示数字键盘,并且只能收入数字,不能输入任何字母中文符号
android:inputType="numberPassword" 密码数字格式-->显示纯数字键盘,并且只能收入数字,不能输入任何字母中文符号,一秒内屏蔽数字
android:inputType=”numberSigned” 带符号数字格式-->显示数字键盘,能在开头输入一个"-"表示负数,其他位置和number属性一样,只能输入数字
android:inputType=”numberDecimal” 带小数点的浮点格式-->显示数字键盘,输入浮点数,只能有一个点号"."
android:inputType=”phone” 拨号键盘-->显示数字键盘,能输入数字和四个符号:"+-*/"
android:inputType=”datetime” 时间日期-->显示数字键盘,能输入数字和三个符号:"/-:"
android:inputType=”date” 日期键盘-->显示数字键盘,能输入数字和两个符号:"/-"
android:inputType=”time” 时间键盘-->显示数字键盘,能输入数字和两个符号:"/:"

这里那么多属性值,没必要都记住
我这里给大家总结一下经验(刚测试的):

如果要显示数字的虚拟键盘:

使用:android:inputType=”number”
如果需要一些特殊的字符可以加上去:android:digits=”123456789(一些字符如.+-)”
日期,时间那些Type也可满足要求

默认情况,一般都是显示那种九宫格的,拼音输入法(一般是手机系统设置决定)

如果要显示字母键盘的形式:

使用:android:inputType=”textEmailAddress”或android:inputType=”textUri”。。。

如果要显示数字+字母键盘的形式:

使用:android:inputType=”textVisiblePassword”

如果要输入的是密码类型的数据:

使用:android:inputType=”textPassword”
上面这个的密码可以有数字英文符号
如果只是单纯的数字密码,使用:android:inputType=”numberPassword”

四、介绍edittext其他常用属性,网络收集的。

android:layout_gravity="center_vertical" 设置控件显示的位置:默认top,这里居中显示,
android:hint="请输入数字!"设置显示在空间上的提示信息
android:numeric="integer" 设置只能输入整数,如果是小数则是:decimal 
android:singleLine="true" 设置单行输入,一旦设置为true,则文字不会自动换行。
android:password="true" 设置只能输入密码
android:textColor = "#ff8c00" 字体颜色
android:textStyle="bold" 字体,bold, italic, bolditalic 

android:textSize="20dip" 大小
android:capitalize = "characters" 以大写字母写
android:textAlign="center" EditText没有这个属性,
android:textColorHighlight="#cccccc" 被选中文字的底色,默认为蓝色
android:textColorHint="#ffff00" 设置提示信息文字的颜色,默认为灰色

android:textScaleX="1.5" 控制字与字之间的间距
android:typeface="monospace" 字型,normal(普通字体,系统默认使用的字体), sans(非衬线字体), serif(衬线字体), monospace(等宽字体)

android:background="@null" 空间背景,这里没有,指透明,并且隐藏下划线
android:layout_weight="1" 权重,控制控件之间的地位,在控制控件显示的大小时蛮有用的。
android:textAppearance="?android:attr/textAppearanceLargeInverse" 文字外观,这里引用的是系统自带的一个外观,
?表示系统是否有这种外观,否则使用默认的外观。不知道这样理解对不对?

 //通过EditText的layout xml文件中的相关属性来实现:
1. 密码框属性 android:password="true" 这条可以让EditText显示的内容自动为星号,输入时内容会在1秒内变成*字样。
2. 纯数字 android:numeric="true" 这条可以让输入法自动变为数字输入键盘,同时仅允许0-9的数字输入
3. 仅允许 android:capitalize="cwj1987" 这样仅允许接受输入cwj1987,一般用于密码验证 下面是一些扩展的风格属性
android:editable="false" 设置EditText不可编辑
android:singleLine="true" 强制输入的内容在单行
android:ellipsize="end" 自动隐藏尾部溢出数据,一般用于文字内容过长一行无法全部显示时

虽然这些都是很简单,但也很常用。有些属性我们可能不熟悉,有些可能也是有些作用的,多了解一些是好的。

共勉:坚持到无能为力,拼搏到感动自己。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

峥嵘life

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值