如何在我的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.ClipboardManager
和API> = 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;