安卓监听剪切复制粘贴事件实例
来源:互联网 发布:sons of day 知乎 编辑:程序博客网 时间:2024/06/05 05:14
- 剪切复制
- 方法一剪切板
- 方法二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() 方法实现。
至于得到粘贴文本,还是需要通过剪切板获得。
具体代码见方法二。
1 1
- 安卓监听剪切复制粘贴事件实例
- 安卓的复制于粘贴剪切
- 如何阻止复制剪切和粘贴事件
- 监听浏览器复制粘贴事件
- 监听EditText的复制、粘贴、全选、剪切、选择等状态
- android 复制、剪切、粘贴
- android 复制、剪切、粘贴
- android 复制、剪切、粘贴
- android 复制,剪切,粘贴
- vi复制粘贴剪切
- js/jquery实现复制、粘贴、剪切触发事件
- angular输入框内容复制、剪切、粘贴事件触发
- 安卓中的复制粘贴
- vim 的复制粘贴剪切
- Linux文件剪切复制粘贴
- 复制--剪切--粘贴实际流程
- vim 复制粘贴和剪切
- 对Worksheet_SelectionChange事件写入代码后影响Excel剪切、复制粘贴的修正
- 你还不知道mindmanager是什么?
- Lecture 15 Dynamic Programming
- 使用神经网络识别手写数字
- MySQL查询当天每个小时数据的平均值
- HM6.01 (HEVC参考软件)代码总结(一)
- 安卓监听剪切复制粘贴事件实例
- Linux crontab自动周期启动命令
- 老鸟程序员才知道的40个小技巧
- Spring配置JNDI及通过JNDI获取DataSource
- 黄聪:phpexcel中文教程-设置表格字体颜色背景样式、数据
- Java ---Listener监听器
- [程序员面试宝典]空格替换
- 283. Move Zeroes的C++解法
- 图像匹配算法研究之sift算法