android 剪切板监听_安卓监听剪切复制粘贴事件实例

 2023-09-05 阅读 101 评论 0

摘要:本文的剪切复制粘贴事件只针对文本,URI 和 intent 不在讨论范围内。实例代码实现了2个功能:监听剪切复制粘贴事件;获取剪切复制或粘贴的文本;剪切复制有2个方法监听剪切复制事件:剪切板和 EditText 的 onTextContextMenuItem() 方法。二者

本文的剪切复制粘贴事件只针对文本,URI 和 intent 不在讨论范围内。

实例代码实现了2个功能:

监听剪切复制粘贴事件;

获取剪切复制或粘贴的文本;

剪切复制

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

二者的主要区别是:

剪切板是系统层面的全局性质的监听,而onTextContextMenuItem 只对某个 EditText 控件有效。

剪切板只能监听到剪切复制事件,而无法监听到粘贴事件,而 onTextContextMenuItem 能既能监听到剪切复制事件,又能监听粘贴事件;

方法一:剪切板

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

剪切板不仅可以存文本,还可以存 URI 和 Intent;

剪切板上只保持对 PrimaryClip 的引用,即最新一次的剪切数据;

OnPrimaryClipChangedListener 回调只对剪切和复制操作有效,即只有剪切板数据增加时才调用 OnPrimaryClipChangedListener;

剪切板上有多个 ClipData 构成,每次剪切和复制事件都会产生一个 ClipData,ClipData 包含 ClipDescprition 和 若干个保存数据的 ClipData.Item;

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

private void registerCutAndCopyEvents() {

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);

}

}

}

});

}

方法二: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 ICutCopyPasteCallback) {

((ICutCopyPasteCallback) mContext).onCut(null);

break;

case android.R.id.copy:

if (mContext instanceof ICutCopyPasteCallback) {

((ICutCopyPasteCallback) mContext).onCopy(null);

break;

case android.R.id.paste:

if (mContext instanceof IPasteCallback) {

((ICutCopyPasteCallback) mContext).onPaste(null);

}

}

return super.onTextContextMenuItem(id);

}

}

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

ICutCopyPasteCallback 声明如下:

public interface ICutCopyPasteCallback {

void onCut(Object o);

void onCopy(Object o);

void onPaste(Object o);

}

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

粘贴

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

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

具体代码见方法二。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/303.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息