Android中的复制粘贴
Android中的复制粘贴
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。
类似的有:
把剪贴板中的数据强转为文字
剪贴板中的非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()方法将粘贴的内容转换为文字。
如果你的应用支持多种类型,你可以让用户自己选用哪一个。
参考资料
API Guides: Copy and Paste:
http://developer.android.com/guide/topics/text/copy-paste.html
Android中的复制粘贴的更多相关文章
- Android EditText禁止复制粘贴
1,自定义EditText package com.example.ui; import android.annotation.SuppressLint; import android.content ...
- 在CMD命令行和PowerShell中实现复制粘贴功能
在CMD命令行和PowerShell中实现复制粘贴功能 常常使用命令行或者PowerShell的朋友肯定会遇到这样的情况:粘贴文本非常easy,右键--选择粘贴就可以,可是想要复制命令 ...
- android EditText禁止复制粘贴完整代码
<!-- 定义基础布局LinearLayout --> <LinearLayout xmlns:android="http://schemas.android.com/ap ...
- ubuntu18.04下取消中键复制粘贴功能
Q: armlinux开发,主机采用ubuntu18.04操作系统,使用过程中关于鼠标中键有如下操作现象, 操作: 1.选中文本, 2.将鼠标光标定位到要插入的位置 3.按下鼠标中键 现象:将自动复制 ...
- Android EditText 取消复制粘贴功能,取消横向全屏编辑功能(一)
在做一些安全性的软件时候常常要考虑取消 EditText 上的复制粘贴功能以确保安全性.下面就记录了这个方法: 首先在API-11以下的版本很简单,只需要在Xml布局文件或者用代码把长按属性设置成fa ...
- Eclipse/MyEclipse中使用复制粘贴功能卡的解决办法
最近在MyEclipse中编辑代码时,使用快捷键进行复制粘贴,经常会导致编辑器短暂的停顿,光标不跟随,居然反应不过来,几近假死. 想来想去应该是编辑上的什么配置或者是IDE的什么功能导致,于是进入Pr ...
- C# WinForm:DataTable中数据复制粘贴操作的实现
1. 需要实现类似于Excel的功能,就是在任意位置选中鼠标起点和终点所连对角线所在的矩形,进行复制粘贴. 2. 要实现这个功能,首先需要获取鼠标起点和终点点击的位置. 3. 所以通过GridView ...
- MyEclipse中快速复制粘贴当前行的操作
- xshell复制粘贴
用户看到这个标题肯定会觉得小编脑子坏掉了,复制粘贴不就是Ctrl+C,Ctrl+V嘛,但是在xshell却不尽然. 现象: 在xshell界面中需要用到之前的一段代码,自然是选中,熟练的键入Ctrl+ ...
随机推荐
- [ 高并发]Java高并发编程系列第二篇--线程同步
高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...
- 在SQL2008查找某数据库中的列是否存在某个值
在SQL2008查找某数据库中的列是否存在某个值 --SQL2008查找某数据库中的列是否存在某个值 create proc spFind_Column_In_DB ( @type int,--类型: ...
- .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类
.NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...
- SQL Server 致程序员(容易忽略的错误)
标签:SQL SERVER/MSSQL/DBA/T-SQL好习惯/数据库/需要注意的地方/程序员/容易犯的错误/遇到的问题 概述 因为每天需要审核程序员发布的SQL语句,所以收集了一些程序员的一些常见 ...
- 学习ASP.NET Core,怎能不了解请求处理管道[2]: 服务器在管道中的“龙头”地位
ASP.NET Core管道由注册的服务器和一系列中间件构成.我们在上一篇中深入剖析了中间件,现在我们来了解一下服务器.服务器是ASP .NET Core管道的第一个节点,它负责完整请求的监听和接收, ...
- [译] C# 5.0 中的 Async 和 Await (整理中...)
C# 5.0 中的 Async 和 Await [博主]反骨仔 [本文]http://www.cnblogs.com/liqingwen/p/6069062.html 伴随着 .NET 4.5 和 V ...
- DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(3)
上一篇:<DDD 领域驱动设计-谈谈 Repository.IUnitOfWork 和 IDbContext 的实践(2)> 这篇文章主要是对 DDD.Sample 框架增加 Transa ...
- .Net语言 APP开发平台——Smobiler学习日志:如何快速在手机上实现ContextMenu
最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 样式一 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的&qu ...
- 子类继承父类时JVM报出Error:Implicit super constructor People() is undefined for default constructor. Must define an explicit constructor
当子类继承父类的时候,若父类没有定义带参的构造方法,则子类可以继承父类的默认构造方法 当父类中定义了带参的构造方法,子类必须显式的调用父类的构造方法 若此时,子类还想调用父类的默认构造方法,必须在父类 ...
- Ajax部分
Ajax的概念 AJAX即"Asynchronous Javascript And XML"(异步JavaScript和XML),是一种用于创建快速动态网页的技术. 动态网页:是指 ...