265 votes

Comment copier du texte de manière programmatique dans mon application Android ?

Je construis une application Android et je veux copier la valeur du texte d'un widget EditText. Il est possible pour l'utilisateur d'appuyer sur Menu+A puis Menu+C pour copier la valeur, mais comment le faire de manière programmatique ?

1 votes

Gestionnaire de presse-papiers. developer.Android.com/reference/Android/content/

0 votes

Il s'agit essentiellement d'une question dupliquée de : stackoverflow.com/a/13517876/2116185

490voto

FlySwat Points 61945

Utilisez ClipboardManager#setPrimaryClip mé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

7 votes

Utilisez import android.content.ClipboardManager;

0 votes

Cette fonction fonctionne-t-elle sur API 11+ (y compris lollipop) ou pas ?

41 votes

Qu'est-ce que label ?

222voto

Warpzit Points 11150

Tout le monde est donc d'accord sur la façon de procéder, mais comme personne ne veut donner une solution complète, voici ce que je propose :

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 quelque chose comme ce qui suit déclaré dans le manifeste :

<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="14" />

0 votes

Cela ne fonctionne pas, car le compilateur envoie une erreur : L'appel nécessite le niveau 11 de l'API (le minimum actuel est 7) : Android.content.ClipboardManager#setPrimaryClip ligne 245 Problème d'Android Lint.

2 votes

Avez-vous ajouté target et min sdk à votre manifeste ? Si oui, désactivez l'avertissement Lint.

4 votes

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.

18voto

Suragch Points 197

Mise à jour de la bibliothèque de support Android

À partir d'Android Oreo, la bibliothèque de support ne va que jusqu'à l'API 14. La plupart des applications récentes ont probablement aussi une API minimale de 14, et n'ont donc pas à s'inquiéter des problèmes liés à l'API 11 mentionnés dans certaines des autres réponses. Une grande partie du code peut être nettoyée. (Mais voyez mon historique d'édition si vous supportez encore des 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 à deux.

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

Notes

  • Veillez à importer le android.content.ClipboardManager plutôt que l'ancienne version android.text.ClipboardManager . Idem pour ClipData .
  • Si vous ne participez pas à une activité, vous pouvez obtenir le service avec context.getSystemService() .
  • J'ai utilisé un bloc try/catch pour obtenir le texte à coller parce que plusieurs choses peuvent être null . Vous pouvez vérifier chacun d'eux si vous trouvez cette façon plus lisible.

17voto

Google vous amène à Android.content.ClipboardManager et vous pourriez décider, comme je l'ai fait, que le presse-papiers n'est pas disponible sur API < 11, parce que la page de documentation dit "Depuis : API Level 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 privilégié de travailler avec le presse-papiers, mais il n'est pas disponible au niveau API < 11 (Honeycomb).

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

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

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

13voto

ayrina Points 46
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 ceci

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