Pregunta

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 entonces Menu+C para copiar el valor, pero ¿cómo haría esto mediante programación?

¿Fue útil?

Solución

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

Otros consejos

Entonces, todos están de acuerdo en cómo se debe hacer esto, pero como 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 tiene algo como lo siguiente declarado en manifiesto:

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

Buscar en Google te lleva a android.content.ClipboardManager y podrías decidir, como lo hice yo, que el Portapapeles no está disponible en API <11, porque la página de documentación dice "Desde:Nivel API 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 solo funciona con contenido de texto.

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

Para conseguir cualquiera de ellos necesitas 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 desde EditText (gracias a Warpzit para la verificación de versiones). 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());
        }
    }
}

Actualización de la biblioteca de soporte de Android

A partir de Android Oreo, la biblioteca de soporte solo se reduce a la 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 deben preocuparse por los problemas con la API 11 mencionados en algunas de las otras respuestas Gran parte del código se puede limpiar. (Pero vea mi historial de edición si aún admite versiones anteriores).

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

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 propiedad siguiente a su TextView

android:textIsSelectable="true"

En su clase de Java, escriba esta línea dos establezca la gramática.

myTextView.setTextIsSelectable(true);

Y mantenga presionado el TextView para ver la barra de acción copiar / pegar.

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

Use ClipboardManager.setPrimaryClip ( http://developer.android.com/ referencia / 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 para el usuario para los datos del clip y text es el texto real en el clip. De acuerdo con documentos oficiales .

Es importante utilizar esta importación:

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

E importar import android.content.ClipboardManager;

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top