参考:https://www.jianshu.com/p/213d7062cdbe
1.作用
复制粘贴文本内容,其实手机自带这种功能,实际价值并不是很大。
2.概述
Android中有剪切板功能的类是ClipboardManager。但是在
API 11之前: android.text.ClipboardManager
API 11之后: android.content.ClipboardManager
主要包含以下四个类:
ClipboardManager
: 表示一个剪贴板对象,通过context.getSystemService(CLIPBOARD_SERVICE)
获取。ClipData
: 剪贴板中保存的所有剪贴数据集(剪贴板可同时复制/保存多条多种数据条目),在系统剪贴板里只存在一个,当另一个 clip 对象进来时,前一个 clip 对象会消失。ClipData.Item
: 剪贴数据集中的一个数据条目,它包含了文本、 Uri 或者 Intent 数据,一个 clip 对象可以包含一个或多个 Item 对象。通过addItem(ClipData.Item item)
可以实现往 clip 对象中添加 Item。- ClipDescription:它包含了 ClipData 对象的 metadata 信息。可以通过
getMimeType(int index)
获取。
MimeType 一般有以下四种类型:
//对应 ClipData newPlainText(label, text) 的 MimeType
public static final String MIMETYPE_TEXT_PLAIN = "text/plain";
//对应 ClipData.newHtmlText(label, text, htmlText) 的 MimeType
public static final String MIMETYPE_TEXT_HTML = "text/html";
//对应 ClipData.newUri(cr, label, uri) 的 MimeType
public static final String MIMETYPE_TEXT_URILIST = "text/uri-list";
//对应 ClipData.newIntent(label, intent) 的 MimeType
public static final String MIMETYPE_TEXT_INTENT = "text/vnd.android.intent";
但MIMETYPE_TEXT_URILIST有点特殊,当Uri为content://uri时,它会转为具体的MimeType。
3.简单使用例子
复制
// 获取系统剪贴板
clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
// 创建一个剪贴数据集,包含一个普通文本数据条目(需要复制的数据)
ClipData clipData = ClipData.newPlainText(null, "需要复制的文本数据");
// 把数据集设置(复制)到剪贴板
clipboard.setPrimaryClip(clipData);
类似的方法还有如下:
创建一个包含 htmlText 的 ClipData
一般在浏览器中对网页进行拷贝的时候会调用此方法
其中 htmlText 是包含 HTML 标签的字符串
static public ClipData newHtmlText(CharSequence label, CharSequence text, String htmlText);
创建一个包含 Intent 的 ClipData
static public ClipData newIntent(CharSequence label, Intent intent);
创建一个包含 Uri 的 ClipData,MimeType 会根据 Uri 进行修改
static public ClipData newUri(ContentResolver resolver, CharSequence label, Uri uri);
与 newUri 相对应,但是并不会根据 Uri 修改 MimeType
static public ClipData newRawUri(CharSequence label, Uri uri);
粘贴
// 获取系统剪贴板
ClipboardManager clipboard = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
// 获取剪贴板的剪贴数据集
ClipData clipData1 = clipboard.getPrimaryClip();
if (clipData1 != null && clipData1.getItemCount() > 0) {
// 从数据集中获取(粘贴)第一条文本数据
mNeirong.setText(clipData1.getItemAt(0).getText().toString());
}
剪贴板的数据改变监听
// 获取系统剪贴板
ClipboardManager clipboard = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
// 添加剪贴板数据改变监听器
clipboard.addPrimaryClipChangedListener(new ClipboardManager.OnPrimaryClipChangedListener() {
@Override
public void onPrimaryClipChanged() {
// 剪贴板中的数据被改变,此方法将被回调
}
});
// 移除指定的剪贴板数据改变监听器
// clipboard.removePrimaryClipChangedListener(listener);