Cómo copiar texto mediante programación en mi aplicación Android?


Estoy creando una aplicación para Android y quiero copiar el valor de texto de un widget EditText. Es posible que el usuario presione Menu+A luego Menu+C para copiar el valor, pero ¿cómo haría esto programáticamente?

Author: Ronak Thakkar, 2008-10-26

8 answers

Uso ClipboardManager#setPrimaryClip método:

import android.content.ClipboardManager;

// ...

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

ClipboardManager Referencia API

 342
Author: FlySwat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-22 16:09:44

Así que todos están de acuerdo en cómo se debe hacer esto, pero ya que nadie quiere dar una solución completa, aquí va:

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

Asumo que tienes algo como lo siguiente declarado en manifiesto:

<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="14" />
 208
Author: Warpzit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-13 09:56:10

Googlear te lleva a Android.contenido.ClipboardManager y usted podrían decidir, como lo hice yo, que el portapapeles no está disponible en API

En realidad hay dos clases, la segunda extendiendo la primera - android.texto.ClipboardManager y android.contenido.ClipboardManager.

Android.texto.ClipboardManager existe desde API 1, pero solo funciona con contenido de texto.

Android.contenido.ClipboardManager es el forma preferida de trabajar con portapapeles, pero no está disponible en el nivel de API

Para obtener cualquiera de ellos necesita el siguiente código:

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

Pero a API se tiene que importar android.text.ClipboardManager y API >= 11 android.content.ClipboardManager

 14
Author: Viachaslau Tysianchuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-26 19:23:18
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());
}

Puedes probar esto..

 12
Author: ayrina,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-21 19:10:29

Aquí hay un código para implementar algunas funciones de copiar y pegar desde EditText (gracias a Warpzit para la comprobación de versiones). Puedes engancharlos al evento onclick de tu botón.

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());
        }
    }
}
 7
Author: live-love,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-02 20:38:26

Para habilitar el copiar / pegar estándar para TextView, U puede elegir uno de los siguientes:

Cambio en el archivo de diseño: agregue la siguiente propiedad a su TextView

android:textIsSelectable="true"

En la clase de Java escribir esta línea dos del gramaticalmente.

myTextView.setTextIsSelectable(true);

Y mantenga pulsada la barra de acción copiar/pegar en TextView.

 4
Author: King of Masses,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-05 11:47:58

@FlySwat ya dio la respuesta correcta, solo estoy compartiendo la respuesta completa:

Utilice ClipboardManager.setPrimaryClip ( http://developer.android.com/reference/android/content/ClipboardManager.html ) método:

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

Donde label es una etiqueta visible por el Usuario para los datos del clip y text es el texto real en el clip. Según documentos oficiales.

Es importante usar esta importación:

import android.content.ClipboardManager;
 2
Author: Trinity,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-18 21:26:21

Actualización de la biblioteca de soporte de Android

A partir de Android Oreo, la biblioteca de soporte solo se reduce a API 14. La mayoría de las aplicaciones más nuevas probablemente también tienen una API mínima de 14, y por lo tanto no necesitan preocuparse por los problemas con la API 11 mencionados en algunas de las otras respuestas. Mucho del código se puede limpiar. (Pero vea mi historial de edición si todavía está soportando versiones inferiores.)

Copiar

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

Pegar

Estoy agregando este código como un bono, porque copiar / pegar generalmente se hace en par.

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

Notas

  • Asegúrese de importar la versión android.content.ClipboardManager en lugar de la antigua android.text.ClipboardManager. Mismo para ClipData.
  • Si no estás en una actividad puedes obtener el servicio con context.getSystemService().
  • Usé un bloque try/catch para obtener el texto pegado porque varias cosas pueden ser null. Usted puede comprobar cada uno si usted encuentra de esa manera más legible.
 2
Author: Suragch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-19 00:42:45