¿Cómo copiar texto programáticamente en mi aplicación de Android?

Estoy construyendo 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 lo haría programáticamente?

Use ClipboardManager#setPrimaryClip método ClipboardManager#setPrimaryClip :

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

Referencia de la API ClipboardManager

Entonces, todos están de acuerdo en cómo se debe hacer esto, pero dado 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); } 

Supongo que tienes algo así como siguiente declarado en manifiesto:

  

Google lo lleva a android.content.ClipboardManager y puede decidir, como yo lo hice, que el Portapapeles no está disponible en API <11, porque la página de documentación dice "Desde: API Nivel 11".

En realidad, hay dos clases, la segunda extiende la primera – android.text.ClipboardManager y android.content.ClipboardManager.

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

android.content.ClipboardManager es la forma preferida de trabajar con el portapapeles, pero no está disponible en API Level <11 (Honeycomb).

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

 ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 

Pero para API <11 tienes que importar android.text.ClipboardManager y para API> = 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()); } 

puedes probar esto …

Aquí hay un código para implementar algunas funciones de copiar y pegar de EditText (gracias a Warpzit para verificar la versión). Puede conectarlos al evento onclick de su 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()); } } } 

Para habilitar la copia / pegado estándar para TextView, U puede elegir una de las siguientes opciones:

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

 android:textIsSelectable="true" 

En su clase de Java, escriba esta línea dos, configure gtwigticalmente.

myTextView.setTextIsSelectable(true);

Y mantén presionada la vista de texto para ver la barra de acción copiar / pegar.

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

Utilice el método 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); 

Donde label es una etiqueta visible para el usuario para los datos del clip y el text es el texto real en el clip. De acuerdo con los documentos oficiales .

Es importante usar esta importación:

 import android.content.ClipboardManager; 

Actualización de la biblioteca de soporte de Android

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

Dupdo

 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 una bonificación, porque copiar / pegar generalmente se realiza en pares.

 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 de android.content.ClipboardManager lugar del antiguo android.text.ClipboardManager . Lo mismo para ClipData .
  • Si no está en una actividad, puede obtener el servicio con context.getSystemService() .
  • Utilicé un bloque de prueba / captura para obtener el texto de pegado porque varias cosas pueden ser null . Puede verificar cada uno si lo encuentra más legible.