我是靠谱客的博主 内向帽子,最近开发中收集的这篇文章主要介绍安卓监听剪切复制粘贴事件实例剪切复制粘贴,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

  • 剪切复制
    • 方法一剪切板
    • 方法二EditTextonTextContextMenuItem
  • 粘贴

本文的剪切复制粘贴事件只针对文本,URI 和 intent 不在讨论范围内。
实例代码实现了2个功能:

  • 监听剪切复制粘贴事件;
  • 获取剪切复制或粘贴的文本;

剪切复制

有2个方法监听剪切复制事件:剪切板和 EditText 的 onTextContextMenuItem() 方法。

二者的主要区别是:

  • 剪切板是系统层面的全局性质的监听,而onTextContextMenuItem 只对某个 EditText 控件有效。
  • 剪切板只能监听到剪切复制事件,而无法监听到粘贴事件,而 onTextContextMenuItem 能既能监听到剪切复制事件,又能监听粘贴事件;

方法一:剪切板

关于剪切板,详见官方文档:ClipboardManager。

在这里啰嗦几句关于 Clipboard 的知识点:

  • 剪切板不仅可以存文本,还可以存 URI 和 Intent;
  • 剪切板上只保持对 PrimaryClip 的引用,即最新一次的剪切数据;
  • OnPrimaryClipChangedListener 回调只对剪切和复制操作有效,即只有剪切板数据增加时才调用 OnPrimaryClipChangedListener;
  • 剪切板上有多个 ClipData 构成,每次剪切和复制事件都会产生一个 ClipData,ClipData 包含 ClipDescprition 和 若干个保存数据的 ClipData.Item;

监听剪切和复制事件,如果是文本则保存对应文本:

    private void registerClipEvents() {

        final ClipboardManager manager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

        manager.addPrimaryClipChangedListener(new ClipboardManager.OnPrimaryClipChangedListener() {
            @Override
            public void onPrimaryClipChanged() {

                if (manager.hasPrimaryClip() && manager.getPrimaryClip().getItemCount() > 0) {

                    CharSequence addedText = manager.getPrimaryClip().getItemAt(0).getText();

                    if (addedText != null) {
                        Log.d(TAG, "copied text: " + addedData);
                    }
                }
            }
        });
    }

注意,一定要在 onDestroy() 方法里面去调用 addPrimaryClipChangedListener() 注销掉,否则会出现内存泄露。

方法二:EditText#onTextContextMenuItem

在该方法中,我们可以监听到剪切、复制和粘贴事件,但是需要继承 EditText 重写该方法:

public final class Listen2PasteEditText extends android.support.v7.widget.AppCompatEditText {

    private static final String TAG = "Listen2PasteEditText";

    private Context mContext;

    public Listen2PasteEditText(Context context) {
        super(context);
        mContext = context;
    }

    public Listen2PasteEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
    }

    @Override
    public boolean onTextContextMenuItem(int id) {

        switch (id) {
            case android.R.id.cut:
            if (mContext instanceof IClipCallback) {
                    ((IClipCallback) mContext).onCut(null);
                break;
            case android.R.id.copy:
            if (mContext instanceof IClipCallback) {
                    ((IClipCallback) mContext).onCopy(null);
                break;
            case android.R.id.paste:
                if (mContext instanceof IClipCallback) {
                    ((IClipCallback) mContext).onPaste(null);
                }
        }

        return super.onTextContextMenuItem(id);
    }
}

其中,IClipCallback 是个接口, Listen2PasteEditText 所在的 Activity 需要实现该接口。

IClipCallback 声明如下:

public interface IClipCallback {
    void onCut(Object o);
    void onCopy(Object o);
    void onPaste(Object o);
}

注意,上述代码只是让我们监听到了剪切和复制事件,要想获取文本,还是要借助剪切板,具体见 registerClipEvents() 方法,此处不再赘述。

粘贴

剪切板无法监听到粘贴事件,只能通过 EditText#onTextContextMenuItem() 方法实现。

至于得到粘贴文本,还是需要通过剪切板获得。

具体代码见方法二。

最后

以上就是内向帽子为你收集整理的安卓监听剪切复制粘贴事件实例剪切复制粘贴的全部内容,希望文章能够帮你解决安卓监听剪切复制粘贴事件实例剪切复制粘贴所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部