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?
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);
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" />
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
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..
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());
}
}
}
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.
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;
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 antiguaandroid.text.ClipboardManager
. Mismo paraClipData
. - 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.
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