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

FlySwat
źródło
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" />
Warpzit
źródło
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

Viachaslau Tysianchuk
źródło
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 ..

ayrina
źródło
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());
        }
    }
}
żywa miłość
źródło
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.
Suragch
źródło
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.

Król Mszy
źródło
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;

Mor2
źródło
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;
Trójca
źródło
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);

    }
}
Mehul Boghra
źródło
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)

}
Vijayakumar G.
źródło
Dziękuję Ci! To context.była część, której mi brakowało - być może dlatego, że robię to w ramach fragmentu.
Cullub