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


231

Estoy creando una aplicación para Android y quiero copiar el valor de texto de un widget EditText. Es posible que el usuario presione a Menu+Acontinuación Menu+Cpara copiar el valor, pero ¿cómo iba a hacerlo mediante programación?



Esto es básicamente una pregunta duplicada de: stackoverflow.com/a/13517876/2116185
user2116185

Respuestas:


419

ClipboardManager#setPrimaryClipMétodo de uso :

import android.content.ClipboardManager;

// ...

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

ClipboardManager Referencia API


77
Usoimport android.content.ClipboardManager;
MatheusJardimB

¿Funciona esta función en API 11+ (incluida la piruleta) o no?
Ashraf Alshahawy

22
¿Qué es label?
Alaa M.

2
También puede agregar un mensaje de éxito después de la copia para decirle al usuario que el texto se ha copiadoContext context = getApplicationContext(); Toast.makeText(context, "text copied", Toast.LENGTH_LONG).show();
Shady Sherif

1
@AlaaM. Creo que esta bandeja de clip es una opción de LG y no puedes controlarla
Shady Sherif

217

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" />

No funciona, porque el compilador arroja un error: la llamada requiere API nivel 11 (el mínimo actual es 7): android.content.ClipboardManager # setPrimaryClip line 245 Android Lint Problema.
JavaRunner

2
¿Agregaste target y min sdk a tu manifiesto? En caso afirmativo, desactive la advertencia de pelusa.
Warpzit

44
Agregue las siguientes 3 líneas sobre su método @SuppressLint ({"NewApi", "NewApi", "NewApi", "NewApi"}), @SuppressWarnings ("deprecation"), @TargetApi (11) ........ Eso es lo que hice, y funciona.
RRTW

2
¿Alguien puede decirme cuál es exactamente el uso del método labelin newPlainText? La documentación dice label User-visible label for the clip data.. Pero cuando es labelvisible para el usuario? ¿Y qué tipo de valor / nombre debo poner label?
shadyinside

@tannerjohn Creo que es una especie de vista previa que se usa en alguna parte. Pero no se donde. Pero podrías usar el mismo texto dos veces ...
Warpzit

15

Google te lleva a android.content.ClipboardManager y puedes decidir, como lo hice yo, 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 que extiende la primera: android.text.ClipboardManager y android.content.ClipboardManager.

android.text.ClipboardManager existe desde la 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 obtener cualquiera de ellos, necesita el siguiente código:

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

Pero para API <11 tienes que importar android.text.ClipboardManagery para API> = 11 android.content.ClipboardManager


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


8

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

¿No es posible llamar a los métodos copiar / pegar / cortar de Android sin escribirlos como lo estás haciendo? Hice una barra de herramientas de selección de texto personalizada con la funcionalidad para que el usuario pueda poner un texto seleccionado en negrita / cursiva / subrayado, etc. pero después de la personalización, las funciones predeterminadas copiar / pegar / cortar ya no funcionan, pero los iconos para ellos todavía aparece?

¿Para qué sirve "WordKeeper"?
Desarrollador de Android

7

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

1
¿Para qué sirve la "etiqueta de texto"?
Desarrollador de Android el

@androiddeveloper, nunca he usado la etiqueta para nada, pero mira estas preguntas y respuestas .
Suragch

Entonces, aunque dice que es visible para los usuarios, en realidad no lo es, y depende de los desarrolladores que lo usen si es necesario.
Desarrollador de Android el

5

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.


5
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
ClipData clip = ClipData.newPlainText("label", "Text to copy");
if (clipboard == null || clip == null)
    return;
clipboard.setPrimaryClip(clip);

E importar import android.content.ClipboardManager;


3

@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 hay una etiqueta visible para el usuario para los datos del clip y textes el texto real en el clip. Según los documentos oficiales .

Es importante usar esta importación:

import android.content.ClipboardManager;

¿Por qué copiar \ pegar respuestas? ¿Qué es la etiqueta?
AlexS

@AlexS como dije, otro amigo ya dio una respuesta correcta, solo estoy publicando otra forma con más detalles, creo que sería útil para alguien
Trinity

1

Aquí está mi código de trabajo

/**
 * Method to code text in clip board
 *
 * @param context context
 * @param text    text what wan to copy in clipboard
 * @param label   label what want to copied
 */
public static void copyCodeInClipBoard(Context context, String text, String label) {
    if (context != null) {
        ClipboardManager clipboard = (ClipboardManager) context.getSystemService(CLIPBOARD_SERVICE);
        ClipData clip = ClipData.newPlainText(label, text);
        if (clipboard == null || clip == null)
            return;
        clipboard.setPrimaryClip(clip);

    }
}

Cuando yu compartió un código, intente explicarlo. Puede visitar y consultar cómo responder una pregunta .
Yunus Temurlenk

@YunusTemurlenk Gracias por sus sugerencias, la próxima vez editaré mis respuestas con una descripción
Mehul Boghra

1

Para Kotlin, podemos usar el siguiente método. Puede pegar este método dentro de una actividad o fragmento.

fun copyToClipBoard(context: Context, message: String) {

    val clipBoard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
    val clipData = ClipData.newPlainText("label",message)
    clipBoard.setPrimaryClip(clipData)

}

¡Gracias! El context.era la parte que faltaba - podría ser porque lo estoy haciendo dentro de un fragmento.
Cullub
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.