代码实现:
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
//newPlainText(label, text):返回ClipData对象,数据是文字text,描述是label,MIME类型是MIMETYPE_TEXT_PLAIN。
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);
}
}
EditText的长按事件会自动弹出上下文菜单,其中有“粘贴”“复制”“选择”的功能选项,应该是调用了clipData.getItemCount()方法获得要粘贴的数据。这个粘贴的功能系统已经实现了,不需要我们自己调用了。
The Clipboard Framework
当使用clipboard framework时,把数据放在一个剪切对象(clip object)里,然后这个对象会放在系统的剪贴板里。
clip object (剪切对象)可以有三种形式:
Text:文字字符串
文字是直接放在clip对象中,然后放在剪贴板里;粘贴这个字符串的时候直接从剪贴板拿到这个对象,把字符串放入你的应用存储中。
URI:一个Uri 对象。
复制的时候把一个Uri 对象放在一个clip对象中,然后再放在剪贴板里;粘贴的时候取出这个clip对象,得到Uri,把它解析为一个数据资源比如content provider,然后从资源中复制数据到应用存储中。
Intent: Intent对象。
这支持了复制应用快捷方式。
复制的时候把Intent对象放在clip对象中,再放入剪贴板;粘贴数据时,从clip对象中得到Intent对象,放入应用存储区域中。
剪贴板每次仅会持有一个clip对象,当应用放另一个clip对象进来时,前一个就消失了。
设计有效的复制粘贴功能
为了设计有效的复制粘贴功能,以下几点需要注意:
1.任何时间,都只有一个clip对象在剪贴板里。
新的复制操作都会覆盖前一个clip对象,因为用户可能从你的应用中退出,从其他应用中拷贝一个东西,所以你不能假定用户在你的应用中拷贝的上一个东西一定还放在剪贴板里。
2.一个clip对象,即ClipData中的多个ClipData.Item 对象是为了支持多选项的复制粘贴,而不是为了支持单选的多种形式。
你通常需要clip对象中的所有的项目,即ClipData.Item有一样的形式,比如都是文字,都是URI或都是Intent,而不是混合各种形式。
3.当你提供数据时,你可以提供不同的MIME表达方式。
将你支持的MIME类型加入到ClipDescription中去,然后在你的content provider中实现它。
4.当你从剪贴板得到数据时,你的应用有责任检查可用的MIME类型,然后决定使用哪一个。
即便有一个clip对象在剪贴板中并且用户要求粘贴,你的应用有可能不需要进行粘贴操作
你应该在MIME类型兼容的时候执行粘贴操作。你可以选择使用 coerceToText()方法将粘贴的内容转换为文字。
如果你的应用支持多种类型,你可以让用户自己选用哪一个。