Как программно скопировать текст в моем приложении для Android?

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

ClipboardManager. developer.android.com/reference/android/content/…

IAdapter 26.10.2008 20:21

Это в основном повторяющийся вопрос: stackoverflow.com/a/13517876/2116185

user2116185 10.04.2013 17:19
244
2
107 330
13
Перейти к ответу Данный вопрос помечен как решенный

Ответы 13

Ответ принят как подходящий

Используйте метод ClipboardManager#setPrimaryClip:

import android.content.ClipboardManager;

// ...

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

Справочник по API ClipboardManager

Используйте import android.content.ClipboardManager;

MatheusJardimB 23.12.2014 16:30

Работает ли эта функция на API 11+ (включая леденец) или нет?

Ashraf Alshahawy 25.05.2015 09:35

Что такое label?

Alaa M. 03.12.2016 01:51

Есть ли способ сделать это без отображения Поднос с зажимами? (LG G4S 5.1.1)

Alaa M. 03.12.2016 01:52

вы также можете добавить сообщение об успешном завершении копирования, чтобы сообщить пользователю, что текст скопирован Context context = getApplicationContext(); Toast.makeText(context, "text copied", Toast.LENGTH_LONG).show();

Shady Mohamed Sherif 11.01.2017 16:01

@AlaaM. Я думаю, что этот лоток для зажимов - опция от LG, и вы не можете им управлять.

Shady Mohamed Sherif 11.01.2017 16:02

Как применить текст в Юникоде? Когда текст содержит смайлики, он отображается как xF0x9Fx98x82.

satryaway 24.04.2018 06:40
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());
}

вы можете попробовать это ..

Поиск в Google приводит вас к 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> = 11android.content.ClipboardManager

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

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 line 245 Android Lint Проблема.

JavaRunner 12.10.2012 00:09

Вы добавили целевой и минимальный SDK в свой манифест? Если да, отключите предупреждение о ворсинах.

Warpzit 12.10.2012 01:02

Добавьте следующие 3 строки над своим методом @SuppressLint ({"NewApi", "NewApi", "NewApi", "NewApi"}), @SuppressWarnings ("устаревание"), @TargetApi (11) ........ .Это то, что я сделал, и это работает.

RRTW 17.01.2013 09:13

Подскажите, пожалуйста, в чем конкретно заключается использование label в методе newPlainText? в документе указано label User-visible label for the clip data.. Но когда пользователь видит label? И какое значение / имя я должен указать в label?

shadyinside 03.07.2014 20:02

@tannerjohn Я предполагаю, что это какой-то предварительный просмотр, который где-то используется. Но я не знаю где. Но вы можете просто использовать один и тот же текст дважды ...

Warpzit 03.07.2014 20:21

Самый простой способ избежать ошибок «требуется уровень API 11» - это изменить if (sdk <...) на следующее: if (Build.VERSION.SDK_INT <11)

Rudolf Polzer 24.07.2015 10:19

Разве это не способ вызвать метод копирования / вставки / вырезания по умолчанию, который уже существует в Android?

user5366495 30.11.2015 16:28

Вот код для реализации некоторых функций копирования и вставки из 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, не записывая их, как это делаете вы? Я создал настраиваемую панель инструментов для выделения текста с функциональностью, позволяющей пользователю сделать выделенный текст полужирным / курсивом / подчеркиванием и т. д., Но после настройки функции копирования / вставки / вырезания по умолчанию больше не работают, но значки для их еще появляется?

user5366495 30.11.2015 16:08

Для чего нужен WordKeeper?

android developer 17.01.2017 11:30

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

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

android:textIsSelectable = "true"

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

myTextView.setTextIsSelectable(true);

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

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

Для чего нужен текстовый ярлык?

android developer 17.01.2017 11:31

@androiddeveloper, я никогда ни для чего не использовал ярлык, но см. этот вопрос и ответ.

Suragch 17.01.2017 11:51

Таким образом, даже несмотря на то, что он говорит, что он видим для пользователей, на самом деле это не так, и зависит от разработчиков, которые будут использовать его при необходимости.

android developer 17.01.2017 11:53

@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 24.01.2020 09:05

@AlexS, как я уже сказал, другой друг уже дал правильный ответ, я просто отправляю другой способ с более подробной информацией, я думаю, что это будет полезно для кого-то

Trinity 24.01.2020 14:42
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;

Вот мой рабочий код

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

    }
}

Когда вы поделились кодом, попробуйте его объяснить. Вы можете посетить и проверить как ответить на вопрос.

Yunus Temurlenk 25.02.2020 10:22

@YunusTemurlenk Спасибо за предложения, в следующий раз отредактирую свои ответы с описанием

Mehul Boghra 25.02.2020 10:31

Для 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 13.04.2020 00:05

Если ваше приложение не является редактором метода ввода по умолчанию (IME) или приложением, которое в настоящее время имеет фокус, ваше приложение не может получить доступ к данным буфера обмена на Android 10 или выше. https://developer.android.com/about/versions/10/privacy/changes#clipboard-data

Для 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)

Другие вопросы по теме