如何在我的Android应用程序中以编程方式复制文本?

我正在构build一个Android应用程序,我想复制EditText小部件的文本值。 用户可以按Menu+A然后按Menu+A Menu+C复制值,但是如何以编程方式执行此操作?

http://developer.android.com/reference/android/content/ClipboardManager.html

使用ClipboardManager.setPrimaryClip方法:

 ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); ClipData clip = ClipData.newPlainText("label", "Text to copy"); clipboard.setPrimaryClip(clip); 

所以大家都认为应该这样做,但是由于没有人愿意提供一个完整的解决scheme,所以:

 int sdk = android.os.Build.VERSION.SDK_INT; if(sdk < android.os.Build.VERSION_CODES.HONEYCOMB) { android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); clipboard.setText("text to clip"); } else { android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); android.content.ClipData clip = android.content.ClipData.newPlainText("text label","text to clip"); clipboard.setPrimaryClip(clip); } 

我假设你有以下东西在清单中声明:

 <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="14" /> 

谷歌search带你到android.content.ClipboardManager,你可以像我一样,决定剪贴板不可用在API <11,因为文档页面显示“从:API级别11”。

实际上有两个类,第二个扩展了第一个 – android.text.ClipboardManager和android.content.ClipboardManager。

android.text.ClipboardManager自API 1以来就已经存在,但它只能与文本内容一起工作。

android.content.ClipboardManager是使用剪贴板的首选方式,但它在API Level <11(Honeycomb)上不可用。

要得到他们任何你需要下面的代码:

 ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 

但对于API <11,你必须导入android.text.ClipboardManagerAPI> = 11 android.content.ClipboardManager

 public void onClick (View v) { switch (v.getId()) { case R.id.ButtonCopy: copyToClipBoard(); break; case R.id.ButtonPaste: pasteFromClipBoard(); break; default: Log.d(TAG, "OnClick: Unknown View Received!"); break; } } // Copy EditCopy text to the ClipBoard private void copyToClipBoard() { ClipboardManager clipMan = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); clipMan.setPrimaryClip(editCopy.getText()); } 

你可以试试这个..

这里有一些代码来从EditText实现一些复制和粘贴function(感谢Warpzit进行版本检查)。 您可以将这些钩到您的button的onclick事件。

 public void copy(View v) { int startSelection = txtNotes.getSelectionStart(); int endSelection = txtNotes.getSelectionEnd(); if ((txtNotes.getText() != null) && (endSelection > startSelection )) { String selectedText = txtNotes.getText().toString().substring(startSelection, endSelection); int sdk = android.os.Build.VERSION.SDK_INT; if(sdk < android.os.Build.VERSION_CODES.HONEYCOMB) { android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); clipboard.setText(selectedText); } else { android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); android.content.ClipData clip = android.content.ClipData.newPlainText("WordKeeper",selectedText); clipboard.setPrimaryClip(clip); } } } public void paste(View v) { int sdk = android.os.Build.VERSION.SDK_INT; if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB) { android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); if (clipboard.getText() != null) { txtNotes.getText().insert(txtNotes.getSelectionStart(), clipboard.getText()); } } else { android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); android.content.ClipData.Item item = clipboard.getPrimaryClip().getItemAt(0); if (item.getText() != null) { txtNotes.getText().insert(txtNotes.getSelectionStart(), item.getText()); } } } 

要启用TextView的标准复制/粘贴,U可以select以下选项之一:

更改布局文件:将下面的属性添加到您的TextView中

 android:textIsSelectable="true" 

在你的Java类中写这两行语法。

myTextView.setTextIsSelectable(true);

而长按TextView就可以看到复制/粘贴的动作条。

复制

这个答案将两行代码添加到Warpzit的优秀答案中 ,这些答案是为了抑制有关弃用和新API的编译器警告所必需的。

这允许您仍然支持低于API 11的设备。

 @SuppressLint("NewApi") @SuppressWarnings("deprecation") private void copyText() { int sdk = android.os.Build.VERSION.SDK_INT; if(sdk < android.os.Build.VERSION_CODES.HONEYCOMB) { android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); clipboard.setText("text to clip"); } else { android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); android.content.ClipData clip = android.content.ClipData.newPlainText("text label","text to clip"); clipboard.setPrimaryClip(clip); } } 

我将这个代码添加为奖金,因为复制/粘贴通常是成对的。

 @SuppressLint("NewApi") @SuppressWarnings("deprecation") public void pasteText() { int sdk = android.os.Build.VERSION.SDK_INT; CharSequence pasteString = ""; if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB) { android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); try { pasteString = clipboard.getText(); } catch (Exception e) { e.printStackTrace(); } } else { android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); if (clipboard.getPrimaryClip() != null) { android.content.ClipData.Item item = clipboard.getPrimaryClip().getItemAt(0); pasteString = item.getText(); } } if (pasteString != null) { // use it } } 

@FlySwat已经给出了正确的答案,我只是分享完整的答案:

使用ClipboardManager.setPrimaryClip( http://developer.android.com/reference/android/content/ClipboardManager.html )方法:

 ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); ClipData clip = ClipData.newPlainText("label", "Text to copy"); clipboard.setPrimaryClip(clip); 

其中label是剪辑数据的用户可见标签, text是剪辑中的实际文本。 根据官方文件 。

使用此导入非常重要:

 import android.content.ClipboardManager;