Comment activer le copier-coller standard pour un TextView sous Android?

119

Je veux activer le copier-coller standard pour un TextView (le même que pour EditText). Comment puis-je le faire?

J'ai essayé d'utiliser un EditText non modifiable mais cela ne fonctionnait pas bien (parfois il devenait modifiable ou la superposition de copier-coller n'était pas affichée). Et ce n'est probablement pas une bonne approche en général.

Besoin d'une solution fonctionnelle à partir de l'API 7.

Ixx
la source
Est - ce ce que vous recherchez?
Jermin Bazazian
C'est similaire, mais pas pareil car je veux copier tout le texte. Mais ça a la même apparence. Le problème est que la réponse ne fonctionne qu'à partir de l'API 11 et j'ai besoin de quelque chose qui fonctionne à partir de l'API 7.
Ixx
ClipboardManagerest disponible depuis l'API 1 (regardez ici ). Que diriez-vous d'appuyer longuement, avec une fenêtre contextuelle à copier dans le presse-papiers?
Jermin Bazazian
@Jermin Oui, il semble que je doive créer une solution personnalisée.
Ixx

Réponses:

226

Essayez android:textIsSelectable.

c'est à dire, android:textIsSelectable="true"

CommonsWare
la source
Peut-on le faire pour EditTextPreference?
poudre366
1
@ Powder366: Je pense que cela EditTextPreferenceprend déjà en charge le copier / coller. Cela semble certainement dans l'application Paramètres.
CommonsWare
En fait, cela semble être un bug. S'affiche sur mon appareil Samsung 4.2.2. Nexus7 et Nexus10 fonctionnent. code.google.com/p/android/issues/detail?id=26008
poudre366
Juste une note à ce sujet, si votre vue de texte est initialement masquée et que vous l'affichez par programme à l'aide de setVisibility, vous devez utiliser textView.setTextIsSelectable (true) pour que cela fonctionne. Cela ne fonctionnera pas via xml dans ce cas.
Praveen Singh
58

Pour activer le copier / coller standard pour TextView, U peut choisir l'une des options suivantes:

  1. Modification du fichier de mise en page: ajoutez la propriété ci-dessous à votre TextView

    android:textIsSelectable="true"

  2. Dans votre classe Java, écrivez cette ligne pour la définir par programme. myTextView.setTextIsSelectable(true);

Et appuyez longuement sur TextView, vous pouvez voir la barre d'action copier / coller.

RamiReddy
la source
1
je le fais. comme je clique sur les textes, la barre d'outils avec les boutons «copier» et «sélectionner tous» s'ouvrent. mais après avoir cliqué dessus, rien ne se passe. Que puis-je faire?
Mina Dahesh
2
Cette solution est meilleure que celle marquée correcte avec la coche verte.
Adam Hurwitz
21

Cela fonctionne pour la copie pré-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
la source
4
Une bonne stratégie serait d'utiliser ceci avec la réponse de CommonsWare. Depuis l'ajout de android:textIsSelectablevies dans la mise en page, il sera simplement ignoré aux niveaux d'API inférieurs. Utilisez ensuite la solution d'Ixx dans une instruction if qui vérifie si le niveau d'API est inférieur à 11. Le meilleur des deux mondes. Ce android:textIsSelectablequi est bien, c'est qu'il vous donne la barre d'action de sélection de texte de la plate-forme et qu'il a une belle sensation native.
emil10001
1
La méthode setText (CharSequence) du type ClipboardManager est obsolète
S.M_Emamian
1
Oui, eh bien, cette réponse date d'il y a plus de 2 ans. N'hésitez pas à en modifier ou en ajouter un nouveau.
Ixx
11

Nécessite l'API 11 , code mis à jour, la méthode précédente est obsolète

Solution pour le thème plein écran sans ActionBar

Étendre TextViewet coller dans le constructeur le code suivant

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;
            }
        });
AZ_
la source
9

Dans xml textview collez ce code

android:textIsSelectable="true"

Puis dans un fichier 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();
        }
    });

Condition: vous devez copier et coller le texte qui se trouve dans la vue de texte.

OutCome: En utilisant textview, une fois que j'ai cliqué sur le textview. Il a automatiquement copié le texte qui se trouve dans la vue de texte.

Remarque: lors de l' importation de clipboardmanager, essayez de préférer

Veuillez préférer le gestionnaire de presse-papiers texte

import android.text.ClipboardManager; // prefer this 

essayez d'éviter le gestionnaire de presse-papiers de contenu

import android.content.ClipboardManager; // Not this
Agilanbu
la source
3
  1. utiliser le thème

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

    ou

    @android:style/Theme.WithActionBar
  2. définir TextView en xml

    android:textIsSelectable="true"
  3. voir le résultat

Michael Mao
la source
3

si quelqu'un veut faire un effort supplémentaire et faire la sélection et la copie dans le presse-papiers en un seul 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 est le TextView et phone.Text est le texte qui sera copié dans le presse-papiers.

narcis dpr
la source
0

c'est mieux:

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
la source
-2

Pour un EditText, dans le manifeste à l'intérieur de l'activité, utilisez android:windowSoftInputMode="adjustResize"

Rajeesh
la source