web-dev-qa-db-fra.com

Comment copier du texte par programme dans mon Android app?

Je construis une application Android et je veux copier la valeur de 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 procéderais-je par programme?

214
Zach

Utilisation 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

385
FlySwat

Donc, tout le monde est d’accord sur la façon dont cela devrait être fait, mais puisque 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 quelque chose comme suit déclaré dans manifeste:

<uses-sdk Android:minSdkVersion="7" Android:targetSdkVersion="14" />
213
Warpzit

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

Il y a en fait deux classes, la seconde prolongeant 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 de l'API <11 (Honeycomb).

Pour en obtenir, 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> = 11Android.content.ClipboardManager

15
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 ça ..

14
ayrina

Voici du code pour implémenter des fonctions copier-coller depuis EditText (merci à Warpzit pour le contrôle de version). Vous pouvez les relier à 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());
        }
    }
}
8
live-love

Mise à jour de la bibliothèque de support Android

À partir de Android Oreo, la bibliothèque de support n’appartient qu’à l’API 14. La plupart des applications les plus récentes ont probablement une API minimale de 14, et n’ont donc pas à s’inquiéter des problèmes liés à l’API 11. mentionné dans certaines des autres réponses. Une grande partie du code peut être nettoyée (mais voyez mon historique de montage si vous supportez toujours des versions plus basses.)

Copie

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

Pâte

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

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 version Android.content.ClipboardManager Plutôt que l'ancien Android.text.ClipboardManager. Même chose pour ClipData.
  • Si vous ne faites pas d'activité, vous pouvez obtenir le service avec context.getSystemService().
  • J'ai utilisé un bloc try/catch pour obtenir le texte collé parce que plusieurs choses peuvent être null. Vous pouvez vérifier chacun d'eux si vous le trouvez plus lisible.
6
Suragch

Pour activer le copier/coller standard pour TextView, vous pouvez 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 Java classe, écrivez cette ligne, deux fois la valeur grammaticale.

myTextView.setTextIsSelectable(true);

Et appuyez longuement sur le TextView pour voir la barre d’action copier/coller.

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

et importerimport Android.content.ClipboardManager;

4
Mor2

@FlySwat a déjà donné la bonne réponse, je partage simplement 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); 

label est une étiquette visible par l'utilisateur pour les données du clip et text est le texte réel du clip. Selon document officiel .

Il est important d'utiliser cette importation:

import Android.content.ClipboardManager;
3
Trinity