129 votes

Sélectionner + copier du texte dans un TextView ?

Existe-t-il un moyen de permettre à l'utilisateur de sélectionner / copier du texte dans un TextView ? J'ai besoin de la même fonctionnalité que EditText où l'on peut appuyer longuement sur le contrôle et obtenir les options de sélection / copie, mais j'ai besoin que le contrôle ressemble à un TextView.

J'ai essayé plusieurs choses, comme faire en sorte qu'un EditText utilise l'option editable="none" ou inputType="none", mais ces options conservent l'arrière-plan encadré d'un EditText, ce que je ne veux pas,

Remerciements

------- Mise à jour ----------------------

C'est là à 99%, tout ce que je voudrais, c'est que la barre de sélection soit visible (le truc orange). A part ça, c'est bon, je pourrais vivre avec ça :

<EditText 
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:editable="false"
  style="?android:attr/textViewStyle"
  android:textColor="@color/white"
  android:textAppearance="@android:style/TextAppearance.Medium"
  android:cursorVisible="false"
  android:background="@null" />

Je suppose que cela est dû au fait que cursorVisible="false", mais sans cela, le curseur est présent même si aucune sélection n'est effectuée.

260voto

snaguru Points 21

Android:textIsSelectable fonctionne (au moins dans ICS - je n'ai pas encore vérifié dans les versions antérieures)

<TextView
    android:id="@+id/deviceIdTV"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textIsSelectable="true"
    android:text="" />

73voto

skd Points 641

La vue texte doit être activée, focalisable, longuement cliquable et textIsSelectable.

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text=""
    android:id="@+id/pwTextView"
    android:enabled="true"
    android:textIsSelectable="true"
    android:focusable="true"
    android:longClickable="true" />

23voto

pandre Points 2017

Je pense avoir une meilleure solution. Il suffit d'appeler
registerForContextMenu(yourTextView);

et votre TextView sera enregistré pour recevoir les événements du menu contextuel.

Remplacer alors onCreateContextMenu dans votre Activity

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

J'espère que cela vous aidera, ainsi que tous ceux qui cherchent un moyen de copier du texte à partir d'une page Web. TextView

12voto

Amitoj Points 73
textview1.setTextIsSelectable(true);

Cela permettra à l'utilisateur de sélectionner et de copier du texte en cliquant longuement ou comme nous le faisons habituellement.

10voto

Gibolt Points 4072

Utiliser Kotlin de manière programmatique (copie manuelle)

button.setTextIsSelectable(true)

Ou ajouter une extension de propriété Kotlin

var TextView.selectable
    get() = isTextSelectable
    set(value) = setTextIsSelectable(value)

Appelez ensuite

textview.selectable = true
// or
if (textview.selectable) { ...

Utiliser Kotlin de manière programmatique (Auto-Copie)

Si vous souhaitez effectuer une copie automatique lorsque l'utilisateur appuie longuement sur la vue, voici le code de base nécessaire :

myView.setOnLongClickListener {  
    val clipboardManager = context.getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
    val clip = ClipData.newPlainText("Copied String", myString)
    clipboardManager.setPrimaryClip(clip)
    true // Or false if not consumed
}

Vous pouvez ajouter un Toast pour confirmer que cela s'est produit

Ou ajouter une fonction d'extension Kotlin

myView.copyOnHold() // pass custom string to not use view contents

fun TextView.copyOnHold(customText: String? = null) {
    setOnLongClickListener {
        val clipboardManager = context.getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
        val clip = ClipData.newPlainText("Copied String", customText ?: text)
        clipboardManager.setPrimaryClip(clip)
        true // Or false if not consumed
    }
}

Utilisation de Xml (copie manuelle)

Ajoutez ceci à votre <TextView>

android:textIsSelectable="true"

NOTE : Tous ces éléments requièrent android:enabled="true" y android:focusable="true" qui sont les valeurs par défaut pour un TextView .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X