The Clipboard Framework

  当使用clipboard framework时,把数据放在一个剪切对象(clip object)里,然后这个对象会放在系统的剪贴板里。

  clip object可以有三种形式:

  Text:文字字符串。

  文字是直接放在clip对象中,然后放在剪贴板里;粘贴这个字符串的时候直接从剪贴板拿到这个对象,把字符串放入你的应用存储中。

  URI:一个Uri 对象。

  表示任何形式的URI。这种形式主要用于从一个content provider中复制复杂的数据。

  复制的时候把一个Uri 对象放在一个clip对象中,然后再放在剪贴板里;粘贴的时候取出这个clip对象,得到Uri,把它解析为一个数据资源比如content provider,然后从资源中复制数据到应用存储中。

  Intent: Intent对象。

  这支持了复制应用快捷方式。

  复制的时候把Intent对象放在clip对象中,再放入剪贴板;粘贴数据时,从clip对象中得到Intent对象,放入应用存储区域中。

  剪贴板每次仅会持有一个clip对象,当应用放另一个clip对象进来时,前一个就消失了。

剪贴板的类

ClipboardManager

  ClipboardManager代表了系统的剪贴板,通过getSystemService(CLIPBOARD_SERVICE)获取。

  全名为android.text.ClipboardManager从API 11开始就废弃了。

  取而代之的是它的子类:android.content.ClipboardManager (since API Level 11)。

ClipData, ClipDescription, and ClipData.Item

  前面说的clip对象就是ClipData类的对象,其中包含了一个 ClipDescription对象和一个或多个ClipData.Item对象。

  ClipDescription对象中包含了一个数组,描述clip对象的MIME类型。

  ClipData.Item对象中包含文字、URI或者Intent数据。一个clip对象中可以包含一个或多个Item对象

  比如你想要复制list中的多项数据,你可以为list中的每一项创建一个ClipData.Item对象,然后把它们放进一个ClipData对象中,这样就一次性把多项数据都放在了剪贴板中。

  注意ClipData这个类是API 11才有的。

ClipData中的简洁方法

  ClipData类中有一些静态的简洁方法,用于创建只有一个ClipData.Item和一条简单描述( ClipDescription)的ClipData对象。

  newPlainText(label, text)返回ClipData对象,数据是文字text,描述是label,MIME类型是MIMETYPE_TEXT_PLAIN

  类似的有:

  newUri(resolver, label, URI)

  newIntent(label, intent)

把剪贴板中的数据强转为文字

  剪贴板中的非text数据可以通过ClipData.Item.coerceToText()方法转换为text处理。

  1.这个方法首先会检测item是不是包含text,如果有就直接返回。

  2.不包含text,之后看是否有URI:

  如果这个URI是content URI,并且provider返回文字流,coerceToText()就返回该文字流;

  如果provider不返回文字流,或者这个URI根本不是content URI,coerceToText()方法会返回URI的表达,即 Uri.toString()

  3.最后,如果这个item即不包含text也没有URI,那么它就应该包含Intent, coerceToText() 方法会把Intent对象转化为一个Intent URI返回,  和 Intent.toUri(URI_INTENT_SCHEME)一样。

Android clipboard framework总结

  如图:

复制到剪贴板

  1.首先,获取剪贴板服务:

// Gets a handle to the clipboard service.
ClipboardManager clipboard = (ClipboardManager)
getSystemService(Context.CLIPBOARD_SERVICE);

  2.然后把数据放在ClipData对象中。

  对文字:

// Creates a new text clip to put on the clipboard
ClipData clip = ClipData.newPlainText("simple text","Hello, World!");

  对URI:

// Creates a Uri based on a base Uri and a record ID based on the contact's last name
// Declares the base URI string
private static final String CONTACTS = "content://com.example.contacts"; // Declares a path string for URIs that you use to copy data
private static final String COPY_PATH = "/copy"; // Declares the Uri to paste to the clipboard
Uri copyUri = Uri.parse(CONTACTS + COPY_PATH + "/" + lastName); ... // Creates a new URI clip object. The system uses the anonymous getContentResolver() object to
// get MIME types from provider. The clip object's label is "URI", and its data is
// the Uri previously created.
ClipData clip = ClipData.newUri(getContentResolver(),"URI",copyUri);

  对Intent:

// Creates the Intent
Intent appIntent = new Intent(this, com.example.demo.myapplication.class); ... // Creates a clip object with the Intent in it. Its label is "Intent" and its data is
// the Intent object created previously
ClipData clip = ClipData.newIntent("Intent",appIntent);

  3.把clip对象放在剪贴板中:

// Set the clipboard's primary clip.
clipboard.setPrimaryClip(clip);
 

从剪贴板中粘贴

  以文字的粘贴为例,其他略。

  例子如下:

package com.example.helloclipboard;

import android.os.Bundle;
import android.app.Activity;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast; public class HelloClipboardMainActivity extends Activity { private EditText mEditText1 = null;
private TextView mResultTextView = null; private ClipboardManager mClipboard = null; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hello_clipboard_main); mResultTextView = (TextView) findViewById(R.id.textView1);
mEditText1 = (EditText) findViewById(R.id.editText1);
Button copyButton = (Button) findViewById(R.id.button1); Button pasteButton = (Button) findViewById(R.id.button2); copyButton.setOnClickListener(mOnClickListener);
pasteButton.setOnClickListener(mOnClickListener); } private OnClickListener mOnClickListener = new OnClickListener() { @Override
public void onClick(View v) { switch (v.getId()) {
case R.id.button1:
copyFromEditText1();
break;
case R.id.button2:
pasteToResult();
break; default:
break;
}
}
}; private void copyFromEditText1() { // Gets a handle to the clipboard service.
if (null == mClipboard) {
mClipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); } // Creates a new text clip to put on the clipboard
ClipData clip = ClipData.newPlainText("simple text",
mEditText1.getText()); // Set the clipboard's primary clip.
mClipboard.setPrimaryClip(clip);
} private void pasteToResult() {
// Gets a handle to the clipboard service.
if (null == mClipboard) {
mClipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
} String resultString = "";
// 检查剪贴板是否有内容
if (!mClipboard.hasPrimaryClip()) {
Toast.makeText(HelloClipboardMainActivity.this,
"Clipboard is empty", Toast.LENGTH_SHORT).show();
}
else {
ClipData clipData = mClipboard.getPrimaryClip();
int count = clipData.getItemCount(); for (int i = 0; i < count; ++i) { ClipData.Item item = clipData.getItemAt(i);
CharSequence str = item
.coerceToText(HelloClipboardMainActivity.this);
Log.i("mengdd", "item : " + i + ": " + str); resultString += str;
} }
mResultTextView.setText(resultString);
}
}

设计有效的复制粘贴功能

  为了设计有效的复制粘贴功能,以下几点需要注意:

  1.任何时间,都只有一个clip对象在剪贴板里。

  新的复制操作都会覆盖前一个clip对象,因为用户可能从你的应用中退出,从其他应用中拷贝一个东西,所以你不能假定用户在你的应用中拷贝的上一个东西一定还放在剪贴板里。

  2.一个clip对象,即ClipData中的多个ClipData.Item 对象是为了支持多选项的复制粘贴,而不是为了支持单选的多种形式。

  你通常需要clip对象中的所有的项目,即ClipData.Item有一样的形式,比如都是文字,都是URI或都是Intent,而不是混合各种形式。

  3.当你提供数据时,你可以提供不同的MIME表达方式。

  将你支持的MIME类型加入到ClipDescription中去,然后在你的content provider中实现它。

  4.当你从剪贴板得到数据时,你的应用有责任检查可用的MIME类型,然后决定使用哪一个。

  即便有一个clip对象在剪贴板中并且用户要求粘贴,你的应用有可能不需要进行粘贴操作。

  你应该在MIME类型兼容的时候执行粘贴操作。你可以选择使用 coerceToText()方法将粘贴的内容转换为文字。

  如果你的应用支持多种类型,你可以让用户自己选用哪一个。

资料来源:http://www.cnblogs.com/mengdd/p/3572316.html

android 复制到剪切板的更多相关文章

  1. android实现文本复制到剪切板功能(ClipboardManager)

    Android也有剪切板(ClipboardManager),可以复制一些有用的文本到剪贴板,以便用户可以粘贴的地方使用,下面是使用方法   注意:导包的时候 API 11之前: android.te ...

  2. js-将文本复制到剪切板

    // 将文本复制到剪切板 var clipboard2 = new ClipboardJS('.add_wx_guide_float', { text: function(trigger) { ret ...

  3. Flash10下复制到剪切板的一种新方法

    web开发中常常要实现“复制到剪切板”功能.这个功能很实用,但是由于安全问题,浏览器的限制越来越严,实现的方法也越来越有限了.Firefox默认下不能直接通过Javascript操作剪切板,必须开启相 ...

  4. jquery实现点击复制到剪切板

    1.必须有先引入 jquery库 <script type="text/javascript" src="js/jquery.js"></sc ...

  5. 原创:用VBA实现将鼠标选择的单元格按照指定格式合并并复制到剪切板

    原创:用VBA实现将鼠标选择的单元格按照指定格式合并并复制到剪切板 一.主要实现以下功能:1.用鼠标选择单元格(可谓连续单元格,也可为不连续的)后,按照要求格式“证件号码:+选定内容+“,”+”选定内 ...

  6. ZeroClipboard插件——复制到剪切板

    ZeroClipboard是一个轻量级的jQuery“复制到剪贴板”插件采用了时下流行的零剪贴板库.官网:http://www.steamdev.com/zclip 参数及默认值path(必选)  Z ...

  7. zclip复制到剪切板插件有个bug

    今天发现zclip复制到剪切板插件有个bug,就是在遨游和360浏览器的兼容模式下,点击复制没响应,后来我看了页面代码,发现在这两个浏览器的兼容模式下,生成的是<object>,其他浏览器 ...

  8. ZeroClipboard插件,复制到剪切板

    发现一个复制到剪切板的插件:ZeroClipboard插件.挺好用,用法如下: 头部引用: <script type="text/javascript" src=" ...

  9. 复制到剪切板js代码(转)

    <script type="text/javascript" language="javascript"> //复制到剪切板js代码 functio ...

随机推荐

  1. Ionic3 demo TallyBook 实例1

    1.创建项目 ionic start  TallyBook  blank  创建一个空的项目 ionic cordova  platform  add android   添加andorid平台 io ...

  2. Vue.js项目部署到服务器

    1.申请服务器 2.配置Xshell 3.在服务器手动建自己的根目录,把根目录的文件名复制给项目里面config下面的index.js 4.项目开始打包 npm run build 5.打包完成之后把 ...

  3. spring retry 重试机制完整例子

    public static Boolean vpmsRetryCoupon(final String userId) { // 构建重试模板实例 RetryTemplate retryTemplate ...

  4. 04-4-typeof

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. HTML5定位功能,实现在百度地图上定位

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. iOS开发系列-SQLite

    概述 SQLite3是一款轻型的嵌入式数据库.它占用资源非常低,在嵌入式设备中,可能只需要几百K的内存就够了.它的处理速度比Mysql.PostgreSQL这两款著名的数据库速度还快. 数据库简介 常 ...

  7. 根据url的属性名来取属性值赋值给js

    1.方法一:js的正则表达式:请求路径:http://127.0.0.1/pec/jsp/member/refundOrder.jsp?status=4 <script> var stat ...

  8. HandlerInterceptorAdapter或HandlerInterceptor的使用

    Spring拦截器 HandlerInterceptorAdapter需要继承,HandlerInterceptor需要实现 可以作为日志记录和登录校验来使用 建议使用HandlerIntercept ...

  9. Windows API GetShortPathName GetLongPathName

    函数原型: The GetShortPathName function retrieves the short path form of a specified input path. DWORD G ...

  10. mysql批量增加表中新列存储过程

    一般访问量比较大的网站,请求日志表都是每天一张表独立创建. 业务需要为每张表都添加一个新列,纠结了半天,写了个存储过程如下: 日志表结构类型 tbl_ads_req_20140801, tbl_ads ...