Come copiare il testo a livello di codice nella mia app Android?


Risposte:


419

Utilizzare il ClipboardManager#setPrimaryClipmetodo:

import android.content.ClipboardManager;

// ...

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

ClipboardManager Riferimento API


7
Usaimport android.content.ClipboardManager;
MatheusJardimB il

Questa funzione funziona su API 11+ (incluso lollipop) o no?
Ashraf Alshahawy,

22
Che cosa è label?
Alaa M.,

2
puoi anche aggiungere un messaggio di successo dopo la copia per dire all'utente che il testo è stato copiatoContext context = getApplicationContext(); Toast.makeText(context, "text copied", Toast.LENGTH_LONG).show();
Shady Sherif

1
@AlaaM. Penso che questo vassoio per clip sia un'opzione della LG e non puoi controllarlo
Shady Sherif,

217

Quindi tutti sono d'accordo su come farlo, ma poiché nessuno vuole dare una soluzione completa, ecco qui:

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

Presumo che tu abbia dichiarato qualcosa di simile in manifest:

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

Non funziona, perché il compilatore genera un errore: Call richiede il livello API 11 (il minimo corrente è 7): android.content.ClipboardManager # setPrimaryClip line 245 Problema Lint Android.
JavaRunner,

2
Hai aggiunto target e min sdk al tuo manifest? In caso affermativo, disabilitare l'avvertenza sui filacci.
Warpzit,

4
Aggiungi le seguenti 3 righe sopra il metodo @SuppressLint ({"NewApi", "NewApi", "NewApi", "NewApi"}), @SuppressWarnings ("deprecation"), @TargetApi (11) ........ Questo è quello che ho fatto e funziona.
RRTW,

2
Qualcuno può dirmi che cosa è esattamente l'uso di labelin newPlainTextmetodo? afferma il documentaion label User-visible label for the clip data.. Ma quando è labelvisibile all'utente? E che tipo di valore / nome dovrei inserire label?
Shadyinside,

@tannerjohn La mia ipotesi è che è una sorta di anteprima che viene utilizzata da qualche parte. Ma non so dove. Ma potresti usare lo stesso testo due volte ...
Warpzit,

15

Googling ti porta su android.content.ClipboardManager e potresti decidere, come ho fatto io, che Appunti non è disponibile su API <11, perché la pagina della documentazione dice "Da: API Level 11".

Esistono in realtà due classi, la seconda che estende la prima - android.text.ClipboardManager e android.content.ClipboardManager.

android.text.ClipboardManager esiste dall'API 1, ma funziona solo con il contenuto del testo.

android.content.ClipboardManager è il modo preferito di lavorare con gli appunti, ma non è disponibile a livello API <11 (Honeycomb).

Per ottenerne uno è necessario il seguente codice:

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

Ma per API <11 devi importare android.text.ClipboardManagere per 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());
}

puoi provare questo ..


8

Ecco del codice per implementare alcune funzioni di copia e incolla da EditText (grazie a Warpzit per il controllo della versione). Puoi agganciarli all'evento onclick del tuo pulsante.

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

Non è possibile chiamare i metodi di copia / incolla / taglio di Android senza scriverli come stai facendo? Ho creato una barra degli strumenti di selezione del testo personalizzata con la funzionalità per consentire all'utente di rendere grassetto / corsivo / sottolineato un testo selezionato, ma dopo la personalizzazione, le funzioni predefinite copia / incolla / taglia non funzionano più, ma le icone per li appare ancora?

A cosa serve "WordKeeper"?
sviluppatore Android il

7

Aggiornamento della libreria di supporto Android

A partire da Android Oreo, la libreria di supporto scende solo all'API 14. La maggior parte delle app più recenti probabilmente hanno anche un'API minima di 14, quindi non è necessario preoccuparsi dei problemi con l'API 11 menzionati in alcune delle altre risposte. Gran parte del codice può essere ripulito. (Ma vedi la mia cronologia delle modifiche se stai ancora supportando le versioni precedenti.)

copia

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

Incolla

Sto aggiungendo questo codice come bonus, perché il copia / incolla viene solitamente eseguito in coppia.

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

Appunti

  • Assicurati di importare la android.content.ClipboardManagerversione anziché la vecchia android.text.ClipboardManager. Lo stesso perClipData .
  • Se non sei in un'attività, puoi ottenere il servizio con context.getSystemService() .
  • Ho usato un blocco try / catch per ottenere il testo incolla perché possono esserci più cose null. Puoi controllare ognuno se lo trovi più leggibile.

1
A cosa serve "etichetta di testo"?
sviluppatore Android il

@androiddeveloper, in realtà non ho mai usato l'etichetta per nulla, ma vedi queste domande e risposte .
Suragch,

Quindi, anche se dice che è visibile agli utenti, in realtà non lo è, e dipende dagli sviluppatori per usarlo se necessario.
sviluppatore Android il

5

Per abilitare la copia / incolla standard per TextView, U può scegliere una delle seguenti opzioni:

Modifica del file di layout: aggiungi la proprietà di seguito a TextView

android:textIsSelectable="true"

Nella tua classe Java scrivi questa riga due impostando grammaticalmente.

myTextView.setTextIsSelectable(true);

E premi a lungo su TextView puoi vedere la barra delle operazioni di copia / incolla.


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

E importazione import android.content.ClipboardManager;


3

@FlySwat ha già dato la risposta corretta, sto solo condividendo la risposta completa:

Utilizzare il metodo 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); 

Dove si label trova un'etichetta visibile dall'utente per i dati della clip ed textè il testo effettivo nella clip. Secondo i documenti ufficiali .

È importante utilizzare questa importazione:

import android.content.ClipboardManager;

Perché copi \ incolla le risposte? Cos'è l'etichetta?
AlexS,

@AlexS come ho detto, un altro amico ha già dato una risposta corretta, sto solo pubblicando un altro modo con maggiori dettagli, penso che sarebbe utile per qualcuno
Trinity

1

Ecco il mio codice di lavoro

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

    }
}

Quando hai condiviso un codice, prova a spiegarlo. Puoi visitare e controllare come rispondere a una domanda .
Yunus Temurlenk, il

@YunusTemurlenk Grazie per i tuoi suggerimenti, la prossima volta modificherò le mie risposte con una descrizione
Mehul Boghra,

1

Per Kotlin, possiamo usare il seguente metodo. È possibile incollare questo metodo all'interno di un'attività o di un frammento.

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

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

}

Grazie! L' context.era la parte che mi mancava - potrebbe essere perché lo sto facendo all'interno di un frammento.
Cullub,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.