Comment copier du texte par programmation dans mon application Android?

231

Je crée une application Android et je veux copier la valeur texte d'un widget EditText. Il est possible pour l'utilisateur d'appuyer sur Menu+Apuis Menu+Cde copier la valeur, mais comment procéder par programmation?

Zach
la source
Il s'agit essentiellement d'une question en double de: stackoverflow.com/a/13517876/2116185
user2116185

Réponses:

419

Utilisez la ClipboardManager#setPrimaryClipméthode:

import android.content.ClipboardManager;

// ...

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

ClipboardManager Référence API

FlySwat
la source
7
Utilisationimport android.content.ClipboardManager;
MatheusJardimB
Cette fonction fonctionne-t-elle sur l'API 11+ (y compris la sucette) ou non?
Ashraf Alshahawy,
22
Quel est label ?
Alaa M.
2
vous pouvez également ajouter un message de réussite après la copie pour indiquer à l'utilisateur que le texte est copié Context context = getApplicationContext(); Toast.makeText(context, "text copied", Toast.LENGTH_LONG).show();
Shady Sherif
1
@AlaaM. Je pense que ce plateau de clips est une option du LG et vous ne pouvez pas le contrôler
Shady Sherif
217

Donc, tout le monde est d'accord sur la façon dont cela doit être fait, mais comme personne ne veut donner une solution complète, voici:

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

Je suppose que vous avez déclaré quelque chose comme le suivant dans le manifeste:

<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="14" />
Warpzit
la source
Cela ne fonctionne pas, car le compilateur génère une erreur: l'appel nécessite le niveau d'API 11 (la valeur minimale actuelle est de 7): android.content.ClipboardManager # setPrimaryClip ligne 245 Problème de peluches Android.
JavaRunner
2
Avez-vous ajouté la cible et le min sdk à votre manifeste? Si oui, désactivez l'avertissement de peluches.
Warpzit
4
Ajoutez les 3 lignes suivantes au-dessus de votre méthode @SuppressLint ({"NewApi", "NewApi", "NewApi", "NewApi"}), @SuppressWarnings ("deprecation"), @TargetApi (11) ........ C'est ce que j'ai fait et ça marche.
RRTW
2
Quelqu'un peut-il me dire à quoi sert exactement la méthode labelin newPlainText? déclare la documentaion label User-visible label for the clip data.. Mais quand est-il labelvisible pour l'utilisateur? Et quel type de valeur / nom dois-je mettre label?
shadyinside
@tannerjohn Je suppose que c'est une sorte d'aperçu qui est utilisé quelque part. Mais je ne sais pas où. Mais vous pourriez simplement utiliser le même texte deux fois ...
Warpzit
15

La recherche sur Google vous amène à android.content.ClipboardManager et vous pouvez décider, comme je l'ai fait, que Clipboard n'est pas disponible sur API <11, car la page de documentation indique "Depuis: API niveau 11".

Il existe en fait deux classes, la seconde étendant la première - android.text.ClipboardManager et android.content.ClipboardManager.

android.text.ClipboardManager existe depuis l'API 1, mais il ne fonctionne qu'avec du contenu texte.

android.content.ClipboardManager est le moyen préféré de travailler avec le presse-papiers, mais il n'est pas disponible au niveau API <11 (Honeycomb).

Pour obtenir l'un d'eux, vous avez besoin du code suivant:

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

Mais pour API <11, vous devez importer android.text.ClipboardManageret pour API> = 11 android.content.ClipboardManager

Viachaslau Tysianchuk
la source
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());
}

vous pouvez essayer cela ..

ayrina
la source
8

Voici du code pour implémenter des fonctions de copier-coller depuis EditText (merci à Warpzit pour la vérification de version). Vous pouvez les accrocher à l'événement onclick de votre bouton.

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());
        }
    }
}
l'amour en direct
la source
N'est-il pas possible d'appeler les méthodes copier / coller / couper d'Android sans les écrire comme vous le faites? J'ai créé une barre d'outils de sélection de texte personnalisée avec la fonctionnalité permettant à l'utilisateur de rendre le texte sélectionné en gras / italique / souligné, etc. mais après la personnalisation, les fonctions par défaut copier / coller / couper ne fonctionnent plus, mais les icônes pour les apparaît toujours?
À quoi sert "WordKeeper"?
développeur Android
7

Mise à jour de la bibliothèque de support Android

À partir d'Android Oreo, la bibliothèque de support ne descend qu'à l'API 14. La plupart des applications plus récentes ont probablement également une API minimale de 14, et n'ont donc pas à se soucier des problèmes avec l'API 11 mentionnés dans certaines des autres réponses. Une grande partie du code peut être nettoyée. (Mais consultez mon historique des modifications si vous prenez toujours en charge les versions inférieures.)

Copie

ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", selectedText);
if (clipboard == null || clip == null) return;
clipboard.setPrimaryClip(clip);

Pâte

J'ajoute ce code en bonus, car le copier / coller se fait généralement par paire.

ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
try {
    CharSequence text = clipboard.getPrimaryClip().getItemAt(0).getText();
} catch (Exception e) {
    return;
}

Remarques

  • Assurez-vous d'importer la android.content.ClipboardManagerversion plutôt que l'ancienne android.text.ClipboardManager. Pareil pourClipData .
  • Si vous n'êtes pas dans une activité, vous pouvez obtenir le service avec context.getSystemService() .
  • J'ai utilisé un bloc try / catch pour obtenir le texte collé car plusieurs choses peuvent être null. Vous pouvez vérifier chacun d'eux si vous trouvez cette façon plus lisible.
Suragch
la source
1
À quoi sert «étiquette de texte»?
développeur Android
@androiddeveloper, je n'ai jamais réellement utilisé l'étiquette pour quoi que ce soit, mais consultez ce Q&R .
Suragch
Donc, même s'il dit qu'il est visible pour les utilisateurs, ce n'est pas le cas et dépend des développeurs pour l'utiliser si nécessaire.
développeur Android
5

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

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

android:textIsSelectable="true"

Dans votre classe Java, écrivez cette ligne deux définissez grammaticalement.

myTextView.setTextIsSelectable(true);

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

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

Et importer import android.content.ClipboardManager;

Mor2
la source
3

@FlySwat a déjà donné la bonne réponse, je partage juste la réponse complète:

Utilisez la méthode 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); 

Où se label trouve une étiquette visible par l'utilisateur pour les données du clip et textle texte réel du clip. Selon les documents officiels .

Il est important d'utiliser cette importation:

import android.content.ClipboardManager;
Trinité
la source
Pourquoi copier / coller des réponses? Qu'est-ce que l'étiquette?
AlexS
@AlexS comme je l'ai dit, un autre ami a déjà donné une réponse correcte, je poste juste une autre façon avec plus de détails, je pense que cela serait utile pour quelqu'un
Trinity
1

Voici mon code de travail

/**
 * 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);

    }
}
Mehul Boghra
la source
Lorsque vous avez partagé un code, essayez de l'expliquer. Vous pouvez visiter et vérifier comment répondre à une question .
Yunus Temurlenk
@YunusTemurlenk Merci pour vos suggestions, la prochaine fois je modifierai mes réponses avec une description
Mehul Boghra
1

Pour Kotlin, nous pouvons utiliser la méthode suivante. Vous pouvez coller cette méthode dans une activité ou un fragment.

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

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

}
Vijayakumar G
la source
Je vous remercie! La context.était la partie que je manquais - pourrait être parce que je le fais dans un fragment.
Cullub