Android实现复制/粘贴
参考:
http://developer.android.com/guide/topics/text/copy-paste.html
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)。
if(Build.VERSION.SDK_INT > 11){ android.content.ClipboardManager; }else{ android.text.ClipboardManager; }
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()
方法将粘贴的内容转换为文字。
如果你的应用支持多种类型,你可以让用户自己选用哪一个。
相关推荐
本文将深入探讨如何在Android应用中实现这一功能,特别是在给定的“复制粘贴demo”中使用PopupWindow来实现复制按钮。 首先,我们需要理解Android的文本操作API。在Android中,复制和粘贴操作是通过`...
源码参考,欢迎下载
本篇文章将深入探讨如何在Android中实现ListView的复制粘贴功能。 首先,我们要了解复制和粘贴的基本原理。在Android中,这一功能是通过系统提供的ClipboardManager服务来实现的。ClipboardManager可以存储一个或多...
在一些旧的Android版本或特定场景下,可能会使用其他方式来模拟复制粘贴和剪切操作。如上述代码中提到的两种方法: 1. **模拟按键事件**: 通过创建和分发一个`KeyEvent`来模拟Shift键被按下的情况,这可能在某些...
本文将详细探讨如何在Android中模仿QQ空间和浏览器的复制粘贴功能,使TextView具备类似的功能。 首先,我们需要理解Android的剪贴板机制。Android系统提供了`ClipboardManager`服务,允许应用读取和写入剪贴板数据...
Android原生的文字选择 复制粘贴、全选功能样式代码,呵呵,或许你在定制Android系统的时候,都是从这些小功能开始的,android原生的复制粘贴,可能和现在最新的android 8不太一样,这个是Android3、4版本时候的样子...
Android文件操作列表显示进入退出删除复制粘贴新建文件等等.rar
在Android开发中,复制和粘贴是用户交互中常见的功能,尤其在文本处理或编辑场景中更为重要。这个Demo主要展示了如何在Android应用中实现这一功能。以下将详细讲解实现这些功能的关键步骤和相关知识点。 首先,...
DialogFragment,解决PopupWindow中EditText无法复制粘贴问题。Blog地址:https://blog.csdn.net/qq_37077360/article/details/83505119
本项目提供了一个完整的源码示例,涵盖了Android应用中对文件的基本操作,包括列表显示、进入、退出、删除、复制、粘贴以及新建文件等。下面将详细介绍这些知识点: 1. **文件列表显示**:Android应用可以使用...
例如,Apple的iCloud剪贴板和Microsoft的Your Phone Companion等应用,使iPhone和Windows电脑、Android设备之间的复制粘贴变得可能。 在压缩包文件"复制粘贴.zip"中,可能包含了关于复制粘贴功能的详细教程、快捷键...
本文将深入探讨如何实现一个Android自定义键盘,包括字母数字混合键盘及集成复制粘贴功能。 首先,我们需要了解Android的KeyboardView组件。KeyboardView是Android SDK提供的一种用于显示虚拟键盘的视图,它可以...
Android 国密SM4使用,复制粘贴即可
在Android开发中,"复制和粘贴"是用户交互中常见的功能,特别是在处理文本信息时。这个名为"clipboard_demo"的项目显然展示了如何在Android应用中实现这一功能,特别是针对QQ消息的复制和粘贴操作。以下是关于...
以上就是创建一个包含数字字母混合输入及复制粘贴功能的Android自定义键盘的基本步骤。在实际应用中,可能还需要考虑更多细节,如键盘切换(数字、字母、符号)、键盘动画、自定义键位样式等。通过不断的优化和调整...
在Android开发过程中,有时我们需要将文件从电脑复制到Android模拟器进行测试或调试。本文将详细介绍两种在Android Studio中将文件复制到模拟器的方法:一种是通过Android Studio的图形界面,另一种是使用命令行工具...
Android应用源码之Android 文件操作 列表显示 进入 退出 删除 复制 粘贴 新建文件等等项目安卓应用源码下载.ziAndroid应用源码之Android 文件操作 列表显示 进入 退出 删除 复制 粘贴 新建文件等等项目安卓应用源码...