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

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

8个解决方案

355 votes
使用ClipboardManager方法:
import android.content.ClipboardManager;
// ...
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", "Text to copy");
clipboard.setPrimaryClip(clip);
ClipboardManager API参考
FlySwat answered 2019-03-08T19:08:27Z
210 votes

所以每个人都同意如何做到这一点,但由于没有人想要提供完整的解决方案,这里有:

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);
}

我假设您在清单中声明了以下内容:

Warpzit answered 2019-03-08T19:08:58Z

15 votes

谷歌搜索带你到android.content.ClipboardManager,你可以像我一样决定,剪贴板不适用于API&lt; 11,因为文档页面显示“Since:API Level 11”。

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

android.text.ClipboardManager自API 1起存在,但它仅适用于文本内容。

android.content.ClipboardManager是使用剪贴板的首选方式,但它在API级别&lt; 11(蜂窝)。

要获得其中任何一个,您需要以下代码:

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
但对于API&lt; 11你必须导入android.text.ClipboardManager并且API&gt; = 11 android.content.ClipboardManager
Viachaslau Tysianchuk answered 2019-03-08T19:09:59Z
13 votes
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());
}

你可以试试这个..

ayrina answered 2019-03-08T19:10:25Z

8 votes

下面是一些从EditText实现一些复制和粘贴功能的代码(感谢Warpzit进行版本检查)。 您可以将这些挂钩到按钮的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());
}
}
}

live-love answered 2019-03-08T19:10:53Z

5 votes

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

更改布局文件:将以下属性添加到TextView

android:textIsSelectable="true"

在你的Java类中写下这一行,用语法设置两行。

myTextView.setTextIsSelectable(true);

长按TextView,您可以看到复制/粘贴操作栏。

King of Masses answered 2019-03-08T19:12:11Z

4 votes

Android支持库更新

从Android Oreo开始,支持库仅限于API 14.大多数较新的应用程序可能还具有14的最小API,因此无需担心其他一些答案中提到的API 11的问题。 很多代码都可以清理干净。 (但如果您仍在支持较低版本,请参阅我的编辑历史记录。)

复制

ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", selectedText);
if (clipboard == null) return;
clipboard.setPrimaryClip(clip);

我正在添加此代码作为奖励,因为复制/粘贴通常是成对完成的。

ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
try {
CharSequence text = clipboard.getPrimaryClip().getItemAt(0).getText();
} catch (Exception e) {
return;
}

笔记

请务必导入null版本而不是旧版本android.text.ClipboardManager.与ClipData相同。

如果您不参加活动,可以通过null获得该服务。

我使用try / catch块来获取粘贴文本,因为多个东西可以是null。如果你发现这种方式更具可读性,你可以检查每一个。

Suragch answered 2019-03-08T19:13:25Z

3 votes

@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;

Trinity answered 2019-03-08T19:14:15Z