Android之EditText监听

关于EditText的监听 主要用于设置输入长度给用户友好的提示, 提升良好的用户体验


方式一:

监听输入长度和文本信息  但是却做不了提示功能

    EditText editText = (EditText) findViewById(R.id.et_main_text);
    editText.addTextChangedListener(new TextWatcher() {       

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            L.e("beforeTextChanged : " + s + " - " + start + " - " + count + " - " + after);
            // s: 之前的文字内容
            // start: 添加文字的位置(从0开始)
            // count: 一直是0
            // after: 输入为1 擦除为0
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            L.e("onTextChanged : " + s + " - " + start + " - " + before + " - " + count);
            // s: 之后的文字内容
            // start: 添加文字的位置(从0开始)
            // before: 一直是0
            // after: 输入为1 擦除为0
        }

        @Override
        public void afterTextChanged(Editable s) {
            L.e("afterTextChanged : " + s);
            // s:之后的文字内容
        }
 });


方式二:

监听输入长度,如果长度超过设置长度给出提示,提升用户体验

/**
 * 作者: CoolTone
 * 描述: 限制输入字符长度限制 字符长度到达字符限制时再输入给出友好提示
 */
public class MaxTextLengthFilter implements InputFilter {

    private int mMaxLength;
    private Toast mToast = null;

    public MaxTextLengthFilter(Context context, int max) {
        mMaxLength = max - 1;
        mToast = Toast.makeText(context, String.format("字符不能超过%d个",mMaxLength), 1000);
        // mToast.setGravity(Gravity.TOP, 0, 280);   //设置显示位置
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int d_start, int d_end) {
        int keep = mMaxLength - (dest.length() - (d_end - d_start));
        if (keep < (end - start)) {
            mToast.show();
        }
        if (keep <= 0) {
            return "";
        } else if (keep >= end - start) {
            return null;
        } else {
            return source.subSequence(start, start + keep);
        }
    }
}


在使用时 传入上下文 和 (长度最大限制+1) 即可

 mEditText.setFilters(new InputFilter[]{new MaxTextLengthFilter(this, 12)});


基于方式二,自定义一个EditTextLimit 可以设置EditText的长度限制

这里只是实现了代码设置,如果想要在 xml 里设置,还需要费一些功夫了

/**
 * 作者:CoolTone
 * 描述:可以设置输入长度限制的 EditText
 */
public class EditTextLimit extends EditText {

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

    public EditTextLimit(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    // 设置长度的方法(上下文,长度)
    public void setTextMaxLengthFilter(Context context, int length) {
        this.setFilters(new InputFilter[]{new MaxTextLengthFilter(context, length + 1)});
    }

    class MaxTextLengthFilter implements InputFilter {

        private int mMaxLength;
        private Toast mToast = null;

        public MaxTextLengthFilter(Context context, int max) {
            mMaxLength = max - 1;
            mToast = Toast.makeText(context, String.format("字符不能超过%d个", mMaxLength), Toast.LENGTH_SHORT);
            // mToast.setGravity(Gravity.TOP, 0, 235);   //设置显示位置
        }

        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int d_start, int d_end) {
            int keep = mMaxLength - (dest.length() - (d_end - d_start));
            if (keep < (end - start)) {
                mToast.show();
            }
            if (keep <= 0) {
                return "";
            } else if (keep >= end - start) {
                return null;
            } else {
                return source.subSequence(start, start + keep);
            }
        }
    }
}

用法很简单 findViewById 之后直接调用 setTextMaxLengthFilter( Content context , int length ) 方法即可。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值