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


Answers:


419

使用ClipboardManager#setPrimaryClip方法:

import android.content.ClipboardManager;

// ...

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

ClipboardManager API参考


7
使用import android.content.ClipboardManager;
MatheusJardimB 2014年

此功能是否可以在API 11+(包括棒棒糖)上使用?
阿什拉夫·阿尔沙哈威

22
什么label
Alaa M.

有没有办法在不显示剪辑托盘的情况下执行此操作?(LG G4S 5.1.1)
Alaa M.

2
您还可以在复制后添加成功消息,以告诉用户文本已复制Context context = getApplicationContext(); Toast.makeText(context, "text copied", Toast.LENGTH_LONG).show();
Shady Sherif

217

因此,每个人都同意应如何完成此工作,但是由于没人愿意提供完整的解决方案,因此请按以下步骤进行:

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" />

它不起作用,因为编译器会引发错误:调用要求API级别11(当前最小值为7):android.content.ClipboardManager#setPrimaryClip第245行Android Lint问题。
JavaRunner 2012年

2
您是否在清单中添加了target和min sdk?如果是,请禁用棉绒警告。
Warpzit 2012年

4
在您的方法上方添加以下三行@SuppressLint({“ NewApi”,“ NewApi”,“ NewApi”,“ NewApi”}),@ SuppressWarnings(“ deprecation”),@ TargetApi(11)........那就是我所做的,并且有效。
RRTW

2
谁能告诉我labelin newPlainText方法的确切用途?文件记载label User-visible label for the clip data.。但是什么时候label对用户可见?我应该输入哪种值/名称label
shadyinside 2014年

@tannerjohn我的猜测是,某处使用了某种预览。但是我不知道在哪里。但是您可以只使用两次相同的文本...
Warpzit 2014年

15

Googling将您带到android.content.ClipboardManager,您可以像我一样决定在API <11上不提供剪贴板,因为文档页面显示“ Since:API Level 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


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

你可以试试这个


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

无法像您一样在不编写它们的情况下调用android的复制/粘贴/剪切方法吗?我制作了一个自定义文本选择工具栏,其功能是使用户能够将选定的文本设置为粗体/斜体/下划线等。但是自定义后,默认功能复制/粘贴/剪切不再起作用,但是用于他们仍然出现?

“ WordKeeper”的作用是什么?
Android开发人员

7

Android支持库更新

从Android Oreo开始,支持库仅涉及API14。大多数较新的应用程序的最低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。如果您发现每种方法更具可读性,则可以进行检查。

1
什么是“文本标签”?
Android开发人员

@androiddeveloper,我实际上从未将标签用于任何东西,但请参阅此问答
Suragch

因此,即使它说它对用户可见,但实际上不是,并且需要开发人员来使用它。
Android开发人员

5

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

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

android:textIsSelectable="true"

在您的Java类中,在语法上设置第二行。

myTextView.setTextIsSelectable(true);

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


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


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

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

使用此导入很重要:

import android.content.ClipboardManager;

为什么要复制\粘贴答案?什么是标签?
AlexS

正如我所说的@AlexS,另一个朋友已经给出了正确的答案,我只是在发布另一条包含更多详细信息的方法,我认为这对某人有用
Trinity

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

    }
}

当yu共享一个代码时,请尝试解释它。您可以访问并查看如何回答问题
尤努斯·特穆伦克

@YunusTemurlenk感谢您的建议,下一次我将对我的答案进行描述并进行描述
Mehul Boghra

1

对于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)

}

谢谢!这context.是我缺少的部分-可能是因为我在一个片段中这样做。
Cullub
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.