253

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

4

14 回答 14

464

使用ClipboardManager#setPrimaryClip方法:

import android.content.ClipboardManager;

// ...

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

ClipboardManagerAPI 参考

于 2008-10-26T17:20:44.483 回答
218

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

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" />
于 2012-06-13T09:56:10.537 回答
16

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

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

android.text.ClipboardManager 从 API 1 开始就存在,但它只适用于文本内容。

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

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

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

但是对于API < 11你必须导入android.text.ClipboardManager并且对于API >= 11 android.content.ClipboardManager

于 2012-03-30T10:59:45.830 回答
14
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());
}

你可以试试这个。。

于 2011-10-31T12:01:29.920 回答
13

Android 支持库更新

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

复制

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

粘贴

我将此代码添加为奖励,因为复制/粘贴通常成对完成。

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

笔记

  • 请务必导入android.content.ClipboardManager版本而不是旧的android.text.ClipboardManager. 对ClipData.
  • 如果您不在活动中,您可以使用context.getSystemService().
  • 我使用了 try/catch 块来获取粘贴文本,因为可以有多种内容null。如果您发现这种方式更具可读性,您可以检查每一个。
于 2016-11-28T04:40:40.103 回答
8

这是一些从 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());
        }
    }
}
于 2014-11-11T15:45:24.453 回答
6

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

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

android:textIsSelectable="true"

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

myTextView.setTextIsSelectable(true);

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

于 2016-08-05T11:47:58.013 回答
6
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
ClipData clip = ClipData.newPlainText("label", "Text to copy");
if (clipboard == null || clip == null)
    return;
clipboard.setPrimaryClip(clip);

并导入 import android.content.ClipboardManager;

于 2018-12-12T06:55:13.160 回答
3

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

Wherelabel 是剪辑数据的用户可见标签,并且 text是剪辑中的实际文本。根据官方文档

使用此导入很重要:

import android.content.ClipboardManager;
于 2017-04-18T21:26:21.087 回答
3

对于 Kotlin,我们可以使用以下方法。您可以将此方法粘贴到活动或片段中。

fun copyToClipBoard(context: Context, message: String) {

    val clipBoard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
    val clipData = ClipData.newPlainText("label",message)
    clipBoard.setPrimaryClip(clipData)

}
于 2020-03-17T10:19:02.680 回答
3

对于 Kotlin,请在活动中使用以下代码。

import android.content.ClipboardManager


 val clipBoard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
 val clipData = ClipData.newPlainText("label","Message to be Copied")
 clipBoard.setPrimaryClip(clipData)
于 2020-11-06T19:24:23.813 回答
1

这是我的工作代码

/**
 * Method to code text in clip board
 *
 * @param context context
 * @param text    text what wan to copy in clipboard
 * @param label   label what want to copied
 */
public static void copyCodeInClipBoard(Context context, String text, String label) {
    if (context != null) {
        ClipboardManager clipboard = (ClipboardManager) context.getSystemService(CLIPBOARD_SERVICE);
        ClipData clip = ClipData.newPlainText(label, text);
        if (clipboard == null || clip == null)
            return;
        clipboard.setPrimaryClip(clip);

    }
}
于 2020-02-25T07:01:08.647 回答
0

除非您的应用是默认输入法编辑器 (IME) 或当前具有焦点的应用,否则您的应用无法在 Android 10 或更高版本上访问剪贴板数据。 https://developer.android.com/about/versions/10/privacy/changes#clipboard-data

于 2020-07-02T00:36:51.447 回答
0

我用这个(处理片段)- kotlinish 方式

  private fun copyTextToClipboard(copyText: String) {

        val clipboardManager = requireActivity().
                               getSystemService(CLIPBOARD_SERVICE) as 
                                       android.content.ClipboardManager

        val clipData = ClipData.newPlainText("userLabel" ,copyText.trim())

        clipboardManager.setPrimaryClip(clipData)

    }
于 2022-03-01T18:12:18.813 回答