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.首先,获取剪贴板服务:

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

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

  对文字:

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

  对URI:

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

  对Intent:

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

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

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

从剪贴板中粘贴

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

  例子如下:

  1. package com.example.helloclipboard;
  2.  
  3. import android.os.Bundle;
  4. import android.app.Activity;
  5. import android.content.ClipData;
  6. import android.content.ClipboardManager;
  7. import android.content.Context;
  8. import android.util.Log;
  9. import android.view.View;
  10. import android.view.View.OnClickListener;
  11. import android.widget.Button;
  12. import android.widget.EditText;
  13. import android.widget.TextView;
  14. import android.widget.Toast;
  15.  
  16. public class HelloClipboardMainActivity extends Activity {
  17.  
  18. private EditText mEditText1 = null;
  19. private TextView mResultTextView = null;
  20.  
  21. private ClipboardManager mClipboard = null;
  22.  
  23. @Override
  24. protected void onCreate(Bundle savedInstanceState) {
  25. super.onCreate(savedInstanceState);
  26. setContentView(R.layout.activity_hello_clipboard_main);
  27.  
  28. mResultTextView = (TextView) findViewById(R.id.textView1);
  29. mEditText1 = (EditText) findViewById(R.id.editText1);
  30. Button copyButton = (Button) findViewById(R.id.button1);
  31.  
  32. Button pasteButton = (Button) findViewById(R.id.button2);
  33.  
  34. copyButton.setOnClickListener(mOnClickListener);
  35. pasteButton.setOnClickListener(mOnClickListener);
  36.  
  37. }
  38.  
  39. private OnClickListener mOnClickListener = new OnClickListener() {
  40.  
  41. @Override
  42. public void onClick(View v) {
  43.  
  44. switch (v.getId()) {
  45. case R.id.button1:
  46. copyFromEditText1();
  47. break;
  48. case R.id.button2:
  49. pasteToResult();
  50. break;
  51.  
  52. default:
  53. break;
  54. }
  55. }
  56. };
  57.  
  58. private void copyFromEditText1() {
  59.  
  60. // Gets a handle to the clipboard service.
  61. if (null == mClipboard) {
  62. mClipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
  63.  
  64. }
  65.  
  66. // Creates a new text clip to put on the clipboard
  67. ClipData clip = ClipData.newPlainText("simple text",
  68. mEditText1.getText());
  69.  
  70. // Set the clipboard's primary clip.
  71. mClipboard.setPrimaryClip(clip);
  72. }
  73.  
  74. private void pasteToResult() {
  75. // Gets a handle to the clipboard service.
  76. if (null == mClipboard) {
  77. mClipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
  78. }
  79.  
  80. String resultString = "";
  81. // 检查剪贴板是否有内容
  82. if (!mClipboard.hasPrimaryClip()) {
  83. Toast.makeText(HelloClipboardMainActivity.this,
  84. "Clipboard is empty", Toast.LENGTH_SHORT).show();
  85. }
  86. else {
  87. ClipData clipData = mClipboard.getPrimaryClip();
  88. int count = clipData.getItemCount();
  89.  
  90. for (int i = 0; i < count; ++i) {
  91.  
  92. ClipData.Item item = clipData.getItemAt(i);
  93. CharSequence str = item
  94. .coerceToText(HelloClipboardMainActivity.this);
  95. Log.i("mengdd", "item : " + i + ": " + str);
  96.  
  97. resultString += str;
  98. }
  99.  
  100. }
  101. mResultTextView.setText(resultString);
  102. }
  103. }

设计有效的复制粘贴功能

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

  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. P1082 同余方程(扩欧模板)

    https://www.luogu.org/problem/P1082 #include <iostream> #include <cstdio> #include <q ...

  2. thinkphp 虚拟模型

    虚拟模型是指虽然是模型类,但并不会真正的操作数据库的模型.有些时候,我们建立模型类但又不需要进行数据库操作,仅仅是借助模型类来封装一些业务逻辑,那么可以借助虚拟模型来完成.虚拟模型不会自动连接数据库, ...

  3. DRF 请求生命周期以及各模块解析

    目录 rest_framework框架的封装特点 原生Django与DRF比较 APIView 的请求生命周期 请求模块(request) 解析模块(parser_classes) 异常模块(exce ...

  4. 19-11-14-Finally

    如果这是世界末日的前一晚, 这是我的回答. #include <bits/stdc++.h> using namespace std; int main(){ cout<<&q ...

  5. 19-11-05-Night

    我就是不行. ZJ: 好像是因为郁闷了才咕掉的…… 33 Miemeng 30 00:01:34 40 00:01:46 0 00:01:22 70 00:01:46 不记得当时怎么想的 T1只会暴力 ...

  6. String类的endsWith()方法和startsWith()方法

    String 的endsWith() 方法用于测 试字符串是否以指定的后缀结束.如果参数表示的字符序列是此对象表示的字符序列的后缀,则返回 true:否则返回 false.注意,如果参数是空字符串,或 ...

  7. Python2.7安装matplotlib、numpy

    Windows版本 一.从官网下载python2.7,安装过程中把pip给装上,并且把path也选上,就是把自带的工具全选: 二.在cmd下输入python,会进入交互式界面,出了问题很大程度上是因为 ...

  8. LeetCode387First Unique Character in a String字符串中第一个唯一字符

    给定一个字符串,找到它的第一个不重复的字符,并返回它的索引.如果不存在,则返回 -1. 案例: s = "leetcode" 返回 0. s = "loveleetcod ...

  9. windows修改或删除已保存samba输入的用户名和密码

    可在系统的"控制面板\用户帐户\凭据管理器\windows 凭据"中找到 可以在"开始菜单->运行",输入"control userpasswo ...

  10. day66作业

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...