Jak programowo kopiować tekst w aplikacji na Androida?


Odpowiedzi:


419

Użyj ClipboardManager#setPrimaryClipmetody:

import android.content.ClipboardManager;

// ...

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

ClipboardManager Dokumentacja interfejsu API


7
Użyjimport android.content.ClipboardManager;
— MatheusJardimB

Czy ta funkcja działa na API 11+ (w tym Lollipop), czy nie?
— Ashraf Alshahawy,

22
Co to jest label?
— Alaa M.

Czy istnieje sposób, aby to zrobić bez Klip Taca wyświetlane? (LG G4S 5.1.1)
— Alaa M.

2
możesz również dodać komunikat o powodzeniu po skopiowaniu, aby poinformować użytkownika, że ​​tekst został skopiowanyContext context = getApplicationContext(); Toast.makeText(context, "text copied", Toast.LENGTH_LONG).show();
— Shady Sherif

217

Wszyscy zgadzają się co do tego, jak to zrobić, ale ponieważ nikt nie chce dać kompletnego rozwiązania, oto:

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

Zakładam, że masz coś takiego jak zadeklarowane w manifeście:

<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="14" />

To nie działa, ponieważ kompilator zgłasza błąd: Wywołanie wymaga interfejsu API poziomu 11 (bieżące min to 7): android.content.ClipboardManager # setPrimaryClip linia 245 Android Lint Problem.
— JavaRunner,

2
Czy dodałeś target i min sdk do swojego manifestu? Jeśli tak, wyłącz ostrzeżenie o kłaczkach.
— Warpzit,

4
Dodaj następujące 3 wiersze powyżej metody @SuppressLint ({„NewApi”, „NewApi”, „NewApi”, „NewApi”}), @SuppressWarnings („wycofanie”), @TargetApi (11) ........ .To właśnie zrobiłem i działa.
— RRTW 17.01.13

2
Czy ktoś może mi powiedzieć, jakie dokładnie jest zastosowanie metody labelin newPlainText? dokumentacja stwierdza label User-visible label for the clip data.. Ale kiedy jest labelwidoczny dla użytkownika? A jaką wartość / nazwę powinienem podać label?
— shadyinside

@tannerjohn Domyślam się, że jest to jakiś podgląd, który jest gdzieś używany. Ale nie wiem gdzie. Ale możesz użyć tego samego tekstu dwa razy ...
— Warpzit

15

Googling przenosi Cię do android.content.ClipboardManager i możesz zdecydować, tak jak ja, że ​​Schowek nie jest dostępny w API <11, ponieważ strona dokumentacji mówi „Od: API 11”.

W rzeczywistości istnieją dwie klasy, druga rozszerzająca pierwszą - android.text.ClipboardManager i android.content.ClipboardManager.

android.text.ClipboardManager istnieje od API 1, ale działa tylko z zawartością tekstową.

android.content.ClipboardManager jest preferowanym sposobem pracy ze schowkiem, ale nie jest dostępny na poziomie API <11 (plaster miodu).

Aby uzyskać którykolwiek z nich, potrzebujesz następującego kodu:

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

Ale dla API <11 musisz zaimportować, android.text.ClipboardManagera dla 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());
}

możesz spróbować tego ..


8

Oto kod do implementacji niektórych funkcji kopiowania i wklejania z EditText (dzięki Warpzit do sprawdzania wersji). Możesz podłączyć je do zdarzenia kliknięcia przycisku.

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

Czy nie można wywoływać metod kopiowania / wklejania / wycinania Androida bez pisania ich tak, jak robisz? Zrobiłem niestandardowy pasek wyboru tekstu z funkcją, dzięki której użytkownik może pogrubić / zaznaczyć kursywą / podkreślić itp., Ale po dostosowaniu domyślne funkcje kopiowania / wklejania / wycinania nie działają, ale ikony nadal się pojawiają?

Do czego służy „WordKeeper”?
— programista Androida

7

Aktualizacja biblioteki obsługi Androida

Począwszy od Androida Oreo, biblioteka wsparcia sprowadza się tylko do API 14. Większość nowszych aplikacji prawdopodobnie ma również minimalny interfejs API wynoszący 14, a zatem nie trzeba się martwić o problemy z API 11 wspomniane w niektórych innych odpowiedziach. Wiele kodu można wyczyścić. (Ale zobacz moją historię edycji, jeśli nadal wspierasz niższe wersje).

Kopiuj

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

Pasta

Dodam ten kod jako bonus, ponieważ kopiowanie / wklejanie zwykle odbywa się parami.

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

Notatki

  • Pamiętaj, aby zaimportować android.content.ClipboardManagerwersję zamiast starej android.text.ClipboardManager. To samo dotyczyClipData .
  • Jeśli nie prowadzisz działalności, możesz skorzystać z usługi context.getSystemService() .
  • Użyłem bloku try / catch do uzyskania tekstu wklejania, ponieważ może być wiele rzeczy null. Możesz sprawdzić każdy, jeśli okaże się, że jest to bardziej czytelne.

1
Do czego służy „etykieta tekstowa”?
— programista Androida

@androiddeveloper, tak naprawdę nigdy nie używałem etykiety do niczego, ale zobacz to pytanie i odpowiedzi .
— Suragch

Tak więc, choć mówi, że jest widoczny dla użytkowników, tak naprawdę nie jest i zależy od programistów, aby z niego korzystali w razie potrzeby.
— programista Androida

5

Aby włączyć standardowe kopiowanie / wklejanie dla TextView, możesz wybrać jedną z następujących opcji:

Zmień plik układu: dodaj poniżej właściwości do TextView

android:textIsSelectable="true"

W klasie Java napisz ten wiersz dwa gramatyczne.

myTextView.setTextIsSelectable(true);

I długo naciśnij TextView, możesz zobaczyć pasek akcji kopiuj / wklej.


5
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
ClipData clip = ClipData.newPlainText("label", "Text to copy");
if (clipboard == null || clip == null)
    return;
clipboard.setPrimaryClip(clip);

I importuj import android.content.ClipboardManager;


3

@FlySwat już podał prawidłową odpowiedź, po prostu udostępniam pełną odpowiedź:

Użyj metody 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); 

Gdzie label jest widoczna dla użytkownika etykieta danych klipu i textrzeczywisty tekst w klipie. Według oficjalnych dokumentów .

Ważne jest, aby użyć tego importu:

import android.content.ClipboardManager;

Dlaczego kopiujesz \ wklejasz odpowiedzi? Co to jest etykieta?
— AlexS

@AlexS, jak powiedziałem, inny przyjaciel już udzielił poprawnej odpowiedzi, właśnie zamieszczam inny sposób z większą ilością szczegółów, myślę, że byłby przydatny dla kogoś
— Trinity

1

Oto mój działający kod

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

    }
}

Kiedy udostępniasz kod, spróbuj go wyjaśnić. Możesz odwiedzić i sprawdzić, jak odpowiedzieć na pytanie .
— Yunus Temurlenk

@YunusTemurlenk Dzięki za sugestie, następnym razem będę edytować moje odpowiedzi z opisem
— Mehul Boghra

1

W przypadku Kotlin możemy zastosować następującą metodę. Możesz wkleić tę metodę do działania lub fragmentu.

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

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

}

Dziękuję Ci! To context.była część, której mi brakowało - być może dlatego, że robię to w ramach fragmentu.
— Cullub
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.