Как программно скопировать текст в моем приложении для Android? - PullRequest
208 голосов
/ 26 октября 2008

Я создаю приложение для Android и хочу скопировать текстовое значение виджета EditText. Пользователь может нажать Menu+A, а затем Menu+C, чтобы скопировать значение, но как мне сделать это программно?

Ответы [ 9 ]

379 голосов
/ 26 октября 2008

Использование 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

212 голосов
/ 13 июня 2012

Итак, все согласны с тем, как это должно быть сделано, но, поскольку никто не хочет дать полное решение, вот что:

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" />
15 голосов
/ 30 марта 2012

Googling приводит вас к android.content.ClipboardManager, и вы можете, как и я, решить, что буфер обмена недоступен в API <11, потому что на странице документации написано "Так как: уровень API 11". </p>

На самом деле существует два класса, второй расширяет первый - android.text.ClipboardManager и android.content.ClipboardManager.

android.text.ClipboardManager существует с API 1, но работает только с текстовым содержимым.

android.content.ClipboardManager является предпочтительным способом работы с буфером обмена, но он недоступен на уровне API <11 (Honeycomb). </p>

Чтобы получить любой из них, вам нужен следующий код:

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

Но для API <11 </em> необходимо импортировать android.text.ClipboardManager, а для API> = 11 android.content.ClipboardManager

14 голосов
/ 31 октября 2011
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 голосов
/ 11 ноября 2014

Вот код для реализации некоторых функций копирования и вставки из 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());
        }
    }
}
6 голосов
/ 28 ноября 2016

Обновление библиотеки поддержки 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) 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. Вы можете проверить каждый из них, если найдете такой способ более читабельным.
5 голосов
/ 05 августа 2016

Чтобы включить стандартное копирование / вставку для TextView, U может выбрать один из следующих вариантов:

Изменение в файле макета: добавьте свойство ниже к вашему TextView

android:textIsSelectable="true"

В вашем Java-классе напишите в этой строке два грамматически.

myTextView.setTextIsSelectable(true);

И долгое нажатие на TextView вы можете увидеть панель действий копирования / вставки.

3 голосов
/ 12 декабря 2018
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
ClipData clip = ClipData.newPlainText("label", "Text to copy");
clipboard.setPrimaryClip(clip);

И импорт import android.content.ClipboardManager;

3 голосов
/ 19 апреля 2017

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