2010-06-01 36 views
14

Tengo un ListView donde cada elemento es un TextView.Copiar texto de TextView en Android

que desea habilitar la larga comportamiento similar a una prensa EditText que muestra el menú de contexto por defecto con artículos como "Seleccionar todo", "Cortar todos", "Copiar todo", etc.

¿Hay una forma fácil forma de habilitar esto para un TextView?

+0

en este momento me estoy registrando para un menú contextual y usando el administrador del portapapeles para copiar el texto completo de TextView. Pero parece que debería haber una forma predeterminada de hacer esto. – Erdal

+0

En realidad, el menú contextual está adaptado para eso. Puede personalizarlo en su tiempo libre. También puede echar un vistazo a la clase AlertDialog. Generalmente no se usa para este propósito, pero puede llamarlo con un clic prolongado. Sin embargo, si recuerdo bien, tienes un límite de 3 botones como máximo. – Sephy

+0

Una cosa más, no sé si es aconsejable hacerlo, pero podrías tratar de poner tu lista de vista en un framelayout y agregar otra vista/diseño adentro pero con una visibilidad perdida, y convertir su visibilidad en visible cuando un elemento de su lista se hace clic y actualizar su contenido? – Sephy

Respuesta

20

Creo que tengo una solución. Sólo tiene que llamar
registerForContextMenu(yourTextView);

y su TextView serán registrados para recibir eventos de menú de contexto.

Entonces anular onCreateContextMenu en su Activity: Esperanza

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
    //user has long pressed your TextView 
    menu.add(0, v.getId(), 0, "text that you want to show in the context menu - I use simply Copy"); 

    //cast the received View to TextView so that you can get its text 
    TextView yourTextView = (TextView) v; 

    //place your TextView's text in clipboard 
    ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
    clipboard.setText(yourTextView.getText()); 
} 

esto le ayuda y cualquier otra persona en busca de una manera de copiar texto de un TextView

+0

Gracias por la publicación, justo lo que necesitaba para el nivel de API 2.1. Al principio no funcionó, descubrí que tenía que eliminar esto del manifiesto xml: android: configChanges = "keyboardHidden" – Alan

+4

Funciona. Aunque copia el texto antes de que el usuario realmente haga clic en copiar. Eso podría ser confuso y sobrescribir su portapapeles.Otra forma es realizar la copia en onContextItemSelected. Ya está configurando la id. De opción del menú en la Id. De la vista, pero no la está usando. Además, asegúrese de importar android.text.ClipboardManager en lugar de android.content.ClipboardManager para este ejemplo si está segmentando dispositivos

+0

¿Cómo puedo copiar solo cuando se hace clic en el elemento del menú? –

1

Es posible que desee registrar una onItemLongClickListener en su ListView y luego, según el elemento seleccionado, proporcione al usuario las opciones que elija.

7

En realidad, no tiene que desarrollar esta función usted mismo. Solo necesita usar EditText en lugar de TextView, mientras configura el android: editable de EditText en falso. Mi código está aquí:

R.layout.edittext.xml

<EditText xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="40dip" 
android:editable="false" 
android:background="@null" 
android:textColor="#FFFFFF"/> 

ListItemCopyTextActivity.java

public class ListItemCopyTextActivity extends Activity {  

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    LinearLayout ll = new LinearLayout(this); 
    ListView lv = new ListView(this); 

    String[] values = new String[15]; 
    for (int i = 0; i < 15; i++) { 
     values[i] = "ListItem NO." + i; 
    } 

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
      R.layout.edittext, values); 
    lv.setAdapter(adapter); 

    ll.addView(lv, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 

    setContentView(ll); 

    } 
} 

Puede hacer clic en el elemento de largo, y elegir la selección de texto, copiar, cortar , etc pasado

+2

No funciona para mí. Si editable es falso, aparece "TextView no admite selección de texto. Modo de acción cancelado". Usar android: textIsSelectable es una buena solución para mí. –

3

para permitir a los usuarios copiar parte o la totalidad del valor de la Vista de Texto y pegarlo en otro lugar,

establecer el atributo de XML {@link android.R.styleable#TextView_textIsSelectable android:textIsSelectable}-"true"

o

llamada {@link #setTextIsSelectable setTextIsSelectable(true)}.