zoukankan      html  css  js  c++  java
  • Android中EditText设置输入条件

    一、应用场景

    之前做商城应用时,会有对用户资料的设置情况进行限制,如下:

    (1)用户邮箱,应当只允许输入英文字母,数字和@.两个符号,

    (2)用户手机,应当只能输入数字,禁止输入其他字符。

    (3)用户密码,应当不能输入空格以及中文字符等。

    二、解决方案

    针对用户邮箱以及用户手机,有以下两种解决方案:

    (1)EditText中的android:digits属性:

    它表示EditText能够接受的字符集合。通过配置此属性,就可以实现只允许输入指定的字符。这里列举上述三种场景下的android:digits配置。

    场景一:只允许输入数字 android:digits="0123456789"

    场景二:只允许输入数字和英文字母 android:digits="0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

    场景三:只允许输入数字,英文字母和@.两个符号 android:digits="0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@."

    使用android:digits属性有几个需要注意的地方:

    android:digits属性是隐藏的,无法直接在EditText的可视化属性列表中找到。只能直接在XML布局文件中配置。当在XML中增加了这项配置后,才可以在EditText的可视化属性列表中找到。

    android:digits属性中的字符顺序没有影响,例如只允许输入数字时,可以用android:digits="0123456789",也可以用android:digits="9876543210"。

    android:digits属性中允许有重复字符,有重复字符在使用效果上没有影响。例如android:digits="aaaAAA"和android:digits="aA"效果是一样的。

    android:digits属性只能设置允许输入哪些字符,不能设置禁止输入哪些字符,也就是说android:digits属性只能设置白名单,不能设置黑名单。

    (2)EditText中的android:inputType属性:

    带有中文输入法的手机,通常输入法会有三种类型的软键盘:中文键盘,英文键盘和数字键盘,不同键盘类型之间可以切换。虽然android:digits属性可以让EditText中只允许输入指定类型的字符,但并不能控制软键盘弹出时的类型。例如在设置android:digits只允许输入数字时,可能弹出的软键盘是英文键盘或中文键盘,需要用户点击切换到数字键盘后才可以输入;在设置android:digits只允许输入英文和数字时,可能弹出的软键盘是中文键盘,同样需要用户点击切换到英文键盘和数字键盘后才可以输入。如果能在软键盘显示时就直接跳到对应键盘类型,不需要用户切换就更好了。

    当设置android:inputType为number时,输入法开启时会自动切换到数字键盘。当设置为这里的其他几个选项时,输入法开启时会自动切换到英文字母键盘。这里列举上述三种场景下的android:inputType配置。

    场景一:只允许输入数字 android:inputType="number"。实际上,当inputType设置为number后,EditText中就只能输入数字了,那么android:digits="0123456789"也不用设置了。 如果android:inputType="number"和android:digits同时设置,则实际可以输入的字符以android:digits配置为准。例如android:digits="01234567+-",则可以输入的字符为"01234567+-",这时如果同时设置了android:inputType="number",可以达到自动切换到数字键盘的目的。

    场景二:只允许输入数字和英文字母 android:inputType="textVisiblePassword"。其他几个选项似乎都不太合适,textCapxxx的会有大小写的约束,textPassword显然只能用在密码输入框中,如果不介意软键盘中多几个符号,textEmailAddress倒也可以用在这里。

    场景三:只允许输入数字,英文字母和@.两个符号 android:inputType="textEmailAddress"。

    三、使用正则以及重写TextWatcher限制输入

    下面通过代码演示通过此种方法设置不能输入空格以及中文字符等。
    一般对EditText的操作及处理都是用addTextChangedListener方法来对EditText进行监听,之后在监听方法中去做处理.这里也打算用这个种方法来做,大体的思路是监听EditText中输入的内容,然后将不是中文的部分清除掉,也就是置为空。

    (1)首先我自定义TextWatcher类

    package com.example.panchengjia.limittext;
    import android.text.Editable;
    import android.text.TextWatcher;
    import android.widget.EditText;
    
    /**
     * Created by panhouye on 2017/5/7 0007.
     */
    
    public class LimitInputTextWatcher implements TextWatcher {
        /**
         * et
         */
        private EditText et = null;
        /**
         * 筛选条件
         */
        private String regex;
        /**
         * 默认的筛选条件(正则:不能输入中文和空格)
         * u4E00-u9FA5匹配中文u0020匹配空格
         */
        private String DEFAULT_REGEX = "[u4E00-u9FA5u0020]";
    
        /**
         * 构造方法
         *
         * @param et
         */
        public LimitInputTextWatcher(EditText et) {
            this.et = et;
            this.regex = DEFAULT_REGEX;
        }
    
        /**
         * 构造方法
         *
         * @param et    et
         * @param regex 筛选条件
         */
        public LimitInputTextWatcher(EditText et, String regex) {
            this.et = et;
            this.regex = regex;
        }
    
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    
        }
    
        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    
        }
    
        @Override
        public void afterTextChanged(Editable editable) {
            String str = editable.toString();
            String inputStr = clearLimitStr(regex, str);
            et.removeTextChangedListener(this);
            // et.setText方法可能会引起键盘变化,所以用editable.replace来显示内容
            editable.replace(0, editable.length(), inputStr.trim());
            et.addTextChangedListener(this);
    
        }
    
        /**
         * 清除不符合条件的内容
         *
         * @param regex
         * @return
         */
        private String clearLimitStr(String regex, String str) {
            return str.replaceAll(regex, "");
        }
    }

    (2)Activity中的实现代码

    package com.example.panchengjia.limittext;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.EditText;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            EditText et = (EditText) findViewById(R.id.et);
            //使用LimitInputTextWatcher中默认的输入规则
            et.addTextChangedListener(new LimitInputTextWatcher(et));
            EditText ett = (EditText) findViewById(R.id.ett);
            //设置只能输入中文
            ett.addTextChangedListener(new LimitInputTextWatcher(ett,"[^u4E00-u9FA5]"));
        }
    }
  • 相关阅读:
    iOS ----------各种判断
    iOS----------常见宏定义
    iOS-----------进阶书籍收藏
    iOS----------YYModel
    Mac 系统占用100g的解决办法
    MAC终端常用语法
    iOS----------网络请求错误
    【2020Python修炼记】前端开发之 CSS基础和CSS选择器
    【2020Python修炼记】前端开发之 HTML常用标签汇总
    【教程干货】前端学习网站·资源
  • 原文地址:https://www.cnblogs.com/panhouye/p/6821926.html
Copyright © 2011-2022 走看看