美文网首页
Android 监听复制、剪切、粘贴事件,粘贴后直接进行接口请求

Android 监听复制、剪切、粘贴事件,粘贴后直接进行接口请求

作者: Mr_Yangy | 来源:发表于2018-09-26 01:35 被阅读0次

    简述

    在我们的项目开发中,有时会遇到这样的需求:当用户在输入框中进行了粘贴操作,直接就使用粘贴的内容进行服务端接口的请求,不需要用户再点击确认后才去进行接口请求。

    对于这种情况,可以想到两种方式实现:

    • 1.在复制或截切内容时,记录下复制剪切的内容,在EditText的TextWatcher中判断变更的文本是否与之前记录的内容一致,若一致则认为是进行了粘贴操作。

    但是这种方式存在问题,那就是用户没有进行粘贴操作,而是输入。当输入的内容刚好与之前记录的内容一致时判断为了粘贴。这是不对的。

    • 2.在对文本框进行粘贴操作是,获取粘贴的内容。

    其实以上两种业务实现方式都涉及到了监听复制、剪切、粘贴事件。

    监听复制、剪切、粘贴事件方式有两种:

    1 - 通过剪切板监听。

    2 - 通过自定义EditText,重写onTextContextMenuItem() 方法实现监听。

    监听复制、剪切事件的监听通过这两种方式都可以实现,而粘贴事件只能通过第二种方式实现。

    两种方式的区别:
    • 1.通过剪切板监听,其实是监听整个系统的复制、剪切操作。只要注册了事件监听,不管是App外的操作还是App内部的操作都可以监听到。而onTextContextMenuItem()方法是只针对某个EditText的。

    • 2.剪切板只能监听复制、剪切事件,不能监听剪贴事件,因为Android没提供监听粘贴事件的API。而onTextContextMenuItem()既能监听到剪切复制事件,又能监听粘贴事件;

    具体实现

    剪切板的实现其实在官方文档中找到相应的内容。

        /**
         * 注册剪切板复制、剪切事件监听
         */
        private void registerClipEvents() {
            mClipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
            mOnPrimaryClipChangedListener = new ClipboardManager.OnPrimaryClipChangedListener() {
                @Override
                public void onPrimaryClipChanged() {
                    if (mClipboardManager.hasPrimaryClip() 
                          && mClipboardManager.getPrimaryClip().getItemCount() > 0) {
                        // 获取复制、剪切的文本内容
                        CharSequence content = 
                                 mClipboardManager.getPrimaryClip().getItemAt(0).getText();
                        Log.d("TAG", "复制、剪切的内容为:" + content);
                    }
                }
            };
            mClipboardManager.addPrimaryClipChangedListener(mOnPrimaryClipChangedListener);
        }
    
        /**
         * 注销监听,避免内存泄漏。
         */
        @Override
        protected void onDestroy() {
            super.onDestroy();
            if (mClipboardManager != null && mOnPrimaryClipChangedListener != null) {
                mClipboardManager.removePrimaryClipChangedListener(mOnPrimaryClipChangedListener);
            }
        }
    
    • 自定义EditText
      在onTextContextMenuItem()方法中,我们可以监听到剪切、复制和粘贴事件。

    我这里只监听了粘贴事件。如果有需要,可以自行拓展回调接口。

    /**
     * 可监听粘贴事件的EditText
     */
    public class PasteEditText extends android.support.v7.widget.AppCompatEditText {
    
        private OnPasteCallback mOnPasteCallback;
    
        public interface OnPasteCallback {
            void onPaste();
        }
    
        public PasteEditText(Context context) {
            super(context);
        }
    
        public PasteEditText(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        @Override
        public boolean onTextContextMenuItem(int id) {
            switch (id) {
                case android.R.id.cut:
                    // 剪切
                    break;
                case android.R.id.copy:
                    // 复制
                    break;
                case android.R.id.paste:
                    // 粘贴
                    if (mOnPasteCallback != null) {
                        mOnPasteCallback.onPaste();
                    }
            }
            return super.onTextContextMenuItem(id);
        }
    
        public void setOnPasteCallback(OnPasteCallback onPasteCallback) {
            mOnPasteCallback = onPasteCallback;
        }
    }
    

    通过这种方法监听有点要注意,那就是你在回调中是获取不到复制、剪切、粘贴的文本内容的。想要获取到复制、剪切的文本还是需要通过监听剪切板去获取。
    粘贴的内容的获取其实可以在Activity中添加个标记,在TextWatcher中判断此标记。这样可以间接的获取到粘贴内容。因为在onTextContextMenuItem(),自定义的回调先于super.onTextContextMenuItem(id)执行。这只加单写了EditText中内容为空的情况,如果有内容,那么自己去进行字符串的逻辑操作吧。我这里就不写了。实测有效哦。

    public class TestActivity extends AppCompatActivity {
        // 是否点击了粘贴
        private boolean isClickPaste;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            PasteEditText mEtInputLink = findViewById(R.id.et_input);
            // 粘贴事件监听
            mEtInputLink.setOnPasteCallback(new PasteEditText.OnPasteCallback() {
                @Override
                public void onPaste() {
                    isClickPaste = true;
                }
            });
    
            mEtInputLink.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                }
    
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                }
    
                @Override
                public void afterTextChanged(Editable s) {
                    if (isClickPaste) {
                        isClickPaste = false;
                        String content = mEtInputLink.getEditableText().toString();
                        // 做些你爱做的事情
                    }
                }
            });
        }
    }
    

    OK,本章内容到此就结束了。如果大家有什么更好的方法,或者觉得我的方法有啥可以改进的地方,欢迎评论留言哦。

    相关文章

      网友评论

          本文标题:Android 监听复制、剪切、粘贴事件,粘贴后直接进行接口请求

          本文链接:https://www.haomeiwen.com/subject/upiroftx.html