¿Cómo habilito copiar y pegar estándar para un TextView en Android?

119

Quiero habilitar copiar y pegar estándar para TextView (lo mismo que para EditText). ¿Cómo puedo hacerlo?

Intenté usar un EditText no editable pero no funcionó bien (a veces se volvió editable o no se mostró la superposición de copiar y pegar). Y probablemente no sea un buen enfoque en general.

Necesita una solución funcional a partir de API 7.

Ixx
fuente
¿Es esto lo que estás buscando?
Jermin Bazazian
Es similar, pero no igual porque quiero copiar todo el texto. Pero luce igual. El problema es que la respuesta allí solo funciona a partir de API 11 y necesito algo que funcione desde API 7.
Ixx
ClipboardManagerestá disponible desde API 1 (ver aquí ). ¿Qué tal una pulsación larga, con una ventana emergente para copiar al portapapeles?
Jermin Bazazian
@Jermin Sí, parece que tengo que hacer una solución personalizada.
Ixx

Respuestas:

226

Prueba android:textIsSelectable.

es decir, android:textIsSelectable="true"

CommonsWare
fuente
¿Se puede hacerlo para EditTextPreference?
powder366
1
@ powder366: Creo que EditTextPreferenceya es compatible con copiar / pegar. Ciertamente lo parece en la aplicación Configuración.
CommonsWare
De hecho, parece ser un error. Aparece en mi dispositivo Samsung 4.2.2. Funciona Nexus7 y Nexus10. code.google.com/p/android/issues/detail?id=26008
powder366
Solo una nota sobre esto, si su vista de texto está inicialmente oculta y la está mostrando programáticamente usando setVisibility, entonces necesita usar textView.setTextIsSelectable (true) para que esto funcione. En ese caso, no funcionará a través de xml.
Praveen Singh
58

Para habilitar la función de copiar / pegar estándar para TextView, puede elegir una de las siguientes opciones:

  1. Cambio en el archivo de diseño: agregue la propiedad a continuación a su TextView

    android:textIsSelectable="true"

  2. En su clase de Java, escriba esta línea para configurarlo programáticamente. myTextView.setTextIsSelectable(true);

Y presione prolongadamente en TextView para ver la barra de acción de copiar / pegar.

RamiReddy
fuente
1
yo lo hago. al hacer clic en los textos, la barra de herramientas con "copiar" y "seleccionar todos" l botones abiertos. pero después de hacer clic en ellos no pasa nada. ¿que puedo hacer?
Mina Dahesh
2
Esta solución es mejor que la marcada como correcta con la marca de verificación verde.
Adam Hurwitz
21

Esto funciona para copiar antes de Honeycomb:

import android.text.ClipboardManager;

textView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        ClipboardManager cm = (ClipboardManager)context.getSystemService(Context.CLIPBOARD_SERVICE);
        cm.setText(textView.getText());
        Toast.makeText(context, "Copied to clipboard", Toast.LENGTH_SHORT).show();
    }
});
Ixx
fuente
4
Una buena estrategia sería usar esto junto con la respuesta de CommonsWare. Dado que se agregaron android:textIsSelectablevidas en el diseño, simplemente se ignorará en los niveles de API más bajos. Luego use la solución de Ixx dentro de una declaración if que verifique si el nivel de API está por debajo de 11. Lo mejor de ambos mundos. Lo bueno de esto android:textIsSelectablees que le brinda la barra de acción de selección de texto de la plataforma y tiene una agradable sensación nativa.
emil10001
1
El método setText (CharSequence) del tipo ClipboardManager está en desuso
S.M_Emamian
1
Sí, bueno, esta respuesta es de hace más de 2 años. Siéntase libre de editar o agregar uno nuevo.
Ixx
11

Requiere API 11 , código actualizado, el método anterior está en desuso

Solución para tema de pantalla completa sin ActionBar

Extienda TextViewy pegue el siguiente código en el constructor

this.setOnLongClickListener(new OnLongClickListener() {

            @Override
            public boolean onLongClick(View v) {
                ClipboardManager cManager = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);
                ClipData cData = ClipData.newPlainText("text", getText());
                cManager.setPrimaryClip(cData);
                Util.toast(mContext, string.text_copyed);
                return true;
            }
        });
ARIZONA_
fuente
9

En xml textview pegue este código

android:textIsSelectable="true"

Luego, en el archivo java,

 final TextView txtcopypaste = findViewById(R.id.txtcopypaste); // my textview
    txtcopypaste.setOnClickListener(new View.OnClickListener() { // set onclick listener to my textview
        @Override
        public void onClick(View view) {
            ClipboardManager cm = (ClipboardManager)getApplicationContext().getSystemService(Context.CLIPBOARD_SERVICE);
            cm.setText(txtcopypaste.getText().toString());              
            Toast.makeText(getApplicationContext(), "Copied :)", Toast.LENGTH_SHORT).show();
        }
    });

Requisito: Es necesario copiar y pegar el texto que se encuentra en la vista de texto.

Resultado: usando la vista de texto, una vez que hice clic en la vista de texto. Se copia automáticamente el texto que está en la vista de texto.

Nota: al importar el administrador del portapapeles, intente preferir

Prefiera el administrador del portapapeles de texto

import android.text.ClipboardManager; // prefer this 

intenta evitar el administrador del portapapeles de contenido

import android.content.ClipboardManager; // Not this
Agilanbu
fuente
3
  1. usar tema

    @android:style/Theme.Black.NoTitleBar.Fullscreen

    o

    @android:style/Theme.WithActionBar
  2. establecer TextView en xml

    android:textIsSelectable="true"
  3. ver resultado

Michael Mao
fuente
3

si alguien quiere hacer un esfuerzo adicional y seleccionar y copiar al portapapeles con un solo clic:

 phone.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
                            ClipData clip = ClipData.newPlainText("PhoneNumber", phone.getText());
                            clipboard.setPrimaryClip(clip);

                        }
                    });

phone es el TextView y phone. Text es el texto que se copiará en el portapapeles.

narcis dpr
fuente
0

esto es mejor:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
final android.content.ClipboardManager clipboardManager = (android.content.ClipboardManager) context
        .getSystemService(Context.CLIPBOARD_SERVICE);
final android.content.ClipData clipData = android.content.ClipData
        .newPlainText("text label", "text to clip");
clipboardManager.setPrimaryClip(clipData);
} else {
final android.text.ClipboardManager clipboardManager = (android.text.ClipboardManager) context
        .getSystemService(Context.CLIPBOARD_SERVICE);
clipboardManager.setText("text to clip");
}
Beeing Jk
fuente
-2

Para un EditText, en manifiesto dentro del uso de la actividad android:windowSoftInputMode="adjustResize"

rajeesh
fuente