Як скопіювати текст програмно в моєму додатку Android?


231

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



Це в основному дублює питання: stackoverflow.com/a/13517876/2116185
user2116185

Відповіді:


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

Чи працює ця функція на API 11+ (включаючи льодяник) чи ні?
Ашраф Альшахаві

22
Що таке label?
Алаа М.

Чи є спосіб це зробити, не з'явившись лоток для кліпів ? (LG G4S 5.1.1)
Alaa M.

2
Ви також можете додати повідомлення про успіх після копіювання, щоб повідомити користувачеві, що текст скопійованоContext context = getApplicationContext(); Toast.makeText(context, "text copied", Toast.LENGTH_LONG).show();
Шеді Шериф

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

Це не працює, тому що компілятор видає помилку: для виклику потрібен рівень 11 API (поточний хв. 7): android.content.ClipboardManager # setPrimaryClip рядок 245 Проблема Android Lint.
JavaRunner

2
Ви додали ціль і min sdk у свій маніфест? Якщо так, вимкніть попередження про ворсинку.
Warpzit

4
Додайте наступні 3 рядки над вашим методом @SuppressLint ({"NewApi", "NewApi", "NewApi", "NewApi"}), @SuppressWarnings ("депресія"), @TargetApi (11) ........ . Це те, що я зробив, і це працює.
RRTW

2
Може хто - небудь будь ласка , скажіть мені , що саме використання labelв newPlainTextметоді? документальний стан label User-visible label for the clip data.. Але коли це labelвидно користувачеві? І яке значення / ім’я я повинен містити label?
shadyinside

@tannerjohn Я здогадуюсь, що десь використовується попередній перегляд. Але я не знаю куди. Але ви могли просто використати один і той же текст двічі ...
Warpzit

15

Googling приводить вас до android.content.ClipboardManager, і ви могли вирішити, як я це робив, що буфер обміну не доступний в API <11, оскільки на сторінці документації написано "З: API рівень 11".

Насправді є два класи, другий розширює перший - android.text.ClipboardManager та android.content.ClipboardManager.

android.text.ClipboardManager існує з API 1, але він працює лише з текстовим вмістом.

android.content.ClipboardManager є кращим способом роботи з буфером обміну, але він недоступний на рівні API <11 (стільник).

Для отримання будь-якого з них вам потрібен наступний код:

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"?
андроїд розробник

7

Оновлення бібліотеки підтримки 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. Ви можете перевірити кожного з них, якщо ви вважаєте, що такий спосіб читає.

1
Для чого "текстова мітка"?
андроїд розробник

@androiddeveloper, я ніколи фактично не використовував етикетку ні для чого, але дивіться це питання .
Сурагч

Тож, хоч і каже, що це видно користувачам, насправді це не так, і це залежить від розробників, щоб використовувати його за потреби.
андроїд розробник

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

@ Алекс, як я вже сказав, інший друг вже дав правильну відповідь, я просто розміщую інший спосіб з більш детальними відомостями, я думаю, це комусь стане в нагоді
Трійця,

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

    }
}

Коли ви поділилися кодом, спробуйте пояснити його. Ви можете відвідати і перевірити, як відповісти на запитання .
Юнус Темурленк

@YunusTemurlenk Дякую за ваші пропозиції, наступного разу я відредагую свої відповіді з описом
Мехул Богра

1

Для Котліна ми можемо використовувати наступний метод. Ви можете вставити цей метод всередині активності або фрагменту.

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.