背景

在开发一个IM 的Lib中遇到EditText的问题:

在限制输入30字符长度(无论中英)的情况下若复制粘贴长文本容易在低端机卡住的问题

原先对长度的限制是采用对输入监听的方式,不能得到有效的解决。

//限制输入长度为30,无论中英文
        mEtInput.addTextChangedListener(new TextWatcher() {
            private CharSequence temp;
            private boolean isEdit = true;
            private int selectionStart;
            private int selectionEnd;

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                temp = s;
                if (TextUtils.isEmpty(s)) {
                    mTvConfirm.setBackground(unSendIcon);
                    mTvConfirm.setClickable(false);
                }
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                mTvConfirm.setBackground(sendIcon);
                mTvConfirm.setClickable(true);
            }

            @Override
            public void afterTextChanged(Editable s) {
                selectionStart = mEtInput.getSelectionStart();
                selectionEnd = mEtInput.getSelectionEnd();
                if (temp.length() > 30) {
                    s.delete(selectionStart - 1, selectionEnd);
                    mEtInput.setText(s);
                }

                String message = s.toString().trim();
                if (TextUtils.isEmpty(message)) {
                    mTvConfirm.setBackground(unSendIcon);
                    mTvConfirm.setClickable(false);
                } else {
                    mTvConfirm.setBackground(sendIcon);
                    mTvConfirm.setClickable(true);
                }

            }
        });

解决方式

参考-stackoverflow

【Android】解决EditText 在限制输入长度的情况下若复制粘贴长文本容易在低端机卡住的问题(采用InputFilter)_android

其中最大多数都推荐使用Inputfilter

【Android】解决EditText 在限制输入长度的情况下若复制粘贴长文本容易在低端机卡住的问题(采用InputFilter)_android_02

  • 最终实现
// 添加输入框的筛选条件
    private void addEditTextFilter(InputFilter[] inputFilters) {
        if(null != mEtInput){
            InputFilter[] editFilters = mEtInput.getFilters();
            InputFilter[] newFilters = inputFilters;
            // 将原来旧的筛选数组更新为最新的
            System.arraycopy(editFilters, 0, newFilters, 0, editFilters.length);
            // 设置最新筛选要求
            mEtInput.setFilters(newFilters);
        }
    }

移除原先的监听逻辑操作:

//限制输入长度为30,无论中英文
        mEtInput.addTextChangedListener(new TextWatcher() {

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                if (TextUtils.isEmpty(s)) {
                    mTvConfirm.setBackground(unSendIcon);
                    mTvConfirm.setClickable(false);
                }
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                mTvConfirm.setBackground(sendIcon);
                mTvConfirm.setClickable(true);
            }

            @Override
            public void afterTextChanged(Editable s) {

                String message = s.toString().trim();
                if (TextUtils.isEmpty(message)) {
                    mTvConfirm.setBackground(unSendIcon);
                    mTvConfirm.setClickable(false);
                } else {
                    mTvConfirm.setBackground(sendIcon);
                    mTvConfirm.setClickable(true);
                }

            }
        });

在initview的时候调用该方法即可:

// 添加输入的筛选条件 限制输入长度
        addEditTextFilter(new InputFilter[] {new InputFilter.LengthFilter(maxInputLength)});

最终在华为nova 3测试 (相对现在来说较低端的手机)不会显得卡顿。