(转)Android EditText限制输入字符的5种实现方式

最近项目要求限制密码输入的字符类型, 例如不能输入中文。   现在总结一下EditText的各种实现方式,  以比较各种方法的优劣。

第一种方式:  设置EditText的inputType属性,可以通过xml或者java文件来设置。假如我要设置为显示密码的形式,可以像下面这样设置:

在xml中,   android:inputType="textPassword"

在java文件中,可以用 ev.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

inputType参数有phone、textPasswrod等等属性, 有兴趣的话可以测试一下。

第二种: 设置EditText的android:digits 属性, 这种方式可以指出要支持的字符。比如要限制只能输入数字和字母,可以这样:

android:digits="0123456789abcdefghijklmnopqrstuvwxyz"。 PS:吐槽一下,写着好累,不支持区间操作符~或-

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



evPwd = (EditText) findViewById(R.id.ev_password);
evPwd.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 = evPwd.getText().toString();
        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)){
            evPwd.setText(str);  //设置EditText的字符
            evPwd.setSelection(str.length()); //因为删除了字符,要重写设置新的光标所在位置
        }
    }

 

第四种:通过InputFilter来实现。实现InputFilter过滤器, 需要覆盖一个叫filter的方法。

public abstract CharSequence filter (

CharSequence source,  //输入的文字

int start,  //开始位置

int end,  //结束位置

Spanned dest, //当前显示的内容

int dstart,  //当前开始位置

int dend //当前结束位置

);

注意: IntentFilter是个数组, 也就是说可以写多个过滤条件!

下面的实现使得EditText只接收字符(数字、字母),Character.isLetterOrDigit会把中文也当做Letter, 所以要在写个正则判断是否中文。



evPwd.setFilters(new InputFilter[]{
    new InputFilter() {
        @Override
        public CharSequence filter(CharSequence charSequence, int i, int i1, Spanned spanned, int i2, int i3) {
            String regex = "^[\u4E00-\u9FA5]+$";
            boolean isChinese = Pattern.matches(regex, charSequence.toString());
            if (!Character.isLetterOrDigit(charSequence.charAt(i)) || isChinese) {
                return "";
            }
            return null;
        }
    }
});

 

第五种:    使用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);
        }
    }
}

 

以上是EditText输入限制的所有方法, 如有遗漏欢迎补充~~~

时间: 2024-10-13 03:00:34

(转)Android EditText限制输入字符的5种实现方式的相关文章

android 中如何限制 EditText 最大输入字符数

方法一: 在 xml 文件中设置文本编辑框属性作字符数限制 如:android:maxLength="10" 即限制最大输入字符个数为10 方法二: 在代码中使用InputFilter 进行过滤 //editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(20)}); 即限定最大输入字符数为20 [java] view plaincopy public class TextEditActivity exten

android EditText 限制输入大小写,大写转小写

在写登录验证的时候,需要将用户输入的大写字符转化为小写.看了下API,只有InputFilter.AllCaps是将EditText 的小写英文字符转化为大写.好吧.依赖AllCaps在写个类似的InputFilter吧.基本上Copy AllCaps的代码,只改了两行.大家看代码吧 import android.text.InputFilter; import android.text.SpannableString; import android.text.Spanned; import a

Android图表库MPAndroidChart(六)——换一种思考方式,水平条形图的实现过程

Android图表库MPAndroidChart(六)--换一种思考方式,水平条形图的实现过程 一.基本实现 我们之前实现了条形图,现在来看下水平条形图是怎么实现的,说白了就是横起来,看下效果: 说起来现在写着博客就轻松很多了,大家对MPAndroidChart的大部分流程已经很熟悉了,我们先layout里面定义它的横向View <com.github.mikephil.charting.charts.HorizontalBarChart android:id="@+id/mHorizon

Android EditText的输入监听,输入字符的动态获取

http://itindex.net/detail/38974-android-edittext-%E7%9B%91%E5%90%AC 有时候我们可能会用到时时的监听EditText输入字符的时时监听,监听字符的个数,做一些正则表达式的处理等.如下方法可以实现: 我做的是时时的把EditeText输入的数据同步到TextView上 布局文件: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android&

EditText限制输入字符类型的几种方式

?       近期的项目上须要限制EditText输入字符的类型,就把能够实现这个功能的方法整理了一下: 1.第一种方式是通过EditText的inputType来实现,能够通过xml或者java文件来设置.假如我要设置为显示password的形式,能够像以下这样设置: 在xml中.   android:inputType="textPassword" 在java文件里,能够用 myEditText.setInputType(InputType.TYPE_TEXT_VARIATION

EditText限制输入字符的类型

?       最近的项目上需要限制EditText输入字符的类型,就把可以实现这个功能的方法整理了一下: 1.第一种方式是通过EditText的inputType来实现,可以通过xml或者java文件来设置.假如我要设置为显示密码的形式,可以像下面这样设置: 在xml中,   android:inputType="textPassword" 在java文件中,可以用 myEditText.setInputType(InputType.TYPE_TEXT_VARIATION_PASSW

代码设置Android EditText的输入长度maxLength

在今天开发中遇到一个自己写的自定义控件,因为考虑到复用,在每个需求下的edittext的输入长度不一样,在xml文件里面设置是不能实现这个需求的,于是在发现了这个API,可以通过代码设置! 希望对大家有所帮助! public void setEtCoustomLength(int length){ if (length>0) { etCoustom.setFilters(new InputFilter[]{new InputFilter.LengthFilter(length)}); } } 重

Android EditText中输入价格判断

EditText 中输入价格判断 mText.addTextChangedListener(new SimpleEditWatcher() { @Override public void afterTextChanged(Editable s) { final String text = s == null ? "" : s.toString(); mClickButton = !TextUtils.isEmpty(text.trim()); int index = text.inde

Android - EditText 注意(缺少字符)

EditText 注意(缺少字符) 本文地址:http://blog.csdn.net/caroline_wendy EditText使用监听(Listener)addTextChangedListener时,会创建3个监听,注意使用方式,before在改变之前,on在改变时,after在改变之后. 如果在beforeTextChanged,则会缺少一个字符. private EditText mTitleField; ...... mTitleField = (EditText)v.findV