Domanda

Sto costruendo un'app Android e voglio copiare il valore di testo di un widget EditText. È possibile per l'utente premere Menu+A quindi Menu+C per copiare il valore, ma come lo farei a livello di codice?

È stato utile?

Soluzione

Usa il metodo ClipboardManager#setPrimaryClip :

import android.content.ClipboardManager;

// ...

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

ClipboardManager Riferimento API

Altri suggerimenti

Quindi tutti concordano su come farlo, ma poiché nessuno vuole dare una soluzione completa, ecco:

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 qualcosa come segue dichiarato in manifest:

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

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 riporta & Quot; Da: API Level 11 & Quot ;.

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 di API < 11 (Honeycomb).

Per ottenerne uno è necessario il seguente codice:

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

Ma per API < 11 devi importare android.text.ClipboardManager e per API & Gt; = 11 android.content.ClipboardManager

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 ..

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

Aggiornamento della libreria di supporto Android

A partire da Android Oreo, la libreria di supporto scende solo all'API 14. Probabilmente la maggior parte delle app più recenti ha anche un'API minima di 14, quindi non è necessario preoccuparsi dei problemi con l'API 11 menzionati in alcuni degli altri 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) 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;
}

Note

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

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 azioni di copia / incolla.

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

Usa ClipboardManager.setPrimaryClip ( http://developer.android.com/ metodo di riferimento / android / content / ClipboardManager.html ):

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

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

È importante utilizzare questa importazione:

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

E importa import android.content.ClipboardManager;

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top