Comment copier du texte dans le presse-papiers sous Android?

313

Quelqu'un peut-il me dire comment copier le texte présent dans une vue de texte particulière dans le presse-papiers lorsqu'un bouton est enfoncé?

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mainpage);
        textView = (TextView) findViewById(R.id.textview);
        copyText = (Button) findViewById(R.id.bCopy);
        copyText.setOnClickListener(new View.OnClickListener() {


            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
                String getstring = textView.getText().toString();

                //Help to continue :)

            }
        });
    }

}

Je veux copier le texte dans TextView textView dans le presse-papiers lorsque le bouton bCopyest enfoncé.

Darshan Gowda
la source
2
Copie
Shabbir Dhangot
stackoverflow.com/q/48791271/9274175 Veuillez répondre à ces questions sur coppy
Yash Kale

Réponses:

590

utiliser ClipboardManager

 ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 
 ClipData clip = ClipData.newPlainText(label, text);
 clipboard.setPrimaryClip(clip);

assurez-vous que vous avez importé android.content.ClipboardManageret NON android.text.ClipboardManager. Ce dernier est obsolète. Consultez ce lien pour plus d'informations.

stinepike
la source
3
Ceci est pour API11 + ne fonctionne pas uniquement pour les Go et les versions antérieures
Javier
48
À quoi sert le "label"?
développeur Android
19
@androiddeveloper Explication du paramètre "label": stackoverflow.com/questions/33207809/…
smg
3
@smg C'est donc plus pour les développeurs? Mais comment se fait-il qu'il soit montré aux utilisateurs?
développeur Android
7
Dans androidx, cela devient en faitClipboardManager clipboard = getSystemService(getContext(), ClipboardManager.class);
HoratioCain
72

Voici la méthode pour copier du texte dans le presse-papiers:

private void setClipboard(Context context, String text) {
  if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) {
    android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
    clipboard.setText(text);
  } else {
    android.content.ClipboardManager clipboard = (android.content.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
    android.content.ClipData clip = android.content.ClipData.newPlainText("Copied Text", text);
    clipboard.setPrimaryClip(clip);
  }
}

Cette méthode fonctionne sur tous les appareils Android.

vuhung3990
la source
2
Je ne comprends pas ce que signifie "contexte". Pouvez-vous ajouter un exemple de la façon d'appeler correctement cette méthode? Merci.
E_Blue
1
Il semble également que la valeur de "context" ne soit pas utilisée. Alors pourquoi doit-il être passé en paramètre?
E_Blue
hey guy, le contexte est requis dans un fragment pour appeler getSystemService
vuhung3990
@E_Blue context.getSystemService (Context.CLIPBOARD_SERVICE) ??? vraiment???
androidStud
1
@E_Blue semble être un développeur Android naïf qui pose des questions sur le contexte. Eh bien, ce n'est pas non plus un problème, mais faites attention à votre ton et faites aussi des études / recherches sur les choses.
androidStud
57

Hier, j'ai fait ce cours. Prenez-le, c'est pour tous les niveaux d'API

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

import android.annotation.SuppressLint;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.res.AssetFileDescriptor;
import android.net.Uri;
import android.util.Log;
import de.lochmann.nsafirewall.R;

public class MyClipboardManager {

    @SuppressLint("NewApi")
    @SuppressWarnings("deprecation")
    public boolean copyToClipboard(Context context, String text) {
        try {
            int sdk = android.os.Build.VERSION.SDK_INT;
            if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
                android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context
                        .getSystemService(context.CLIPBOARD_SERVICE);
                clipboard.setText(text);
            } else {
                android.content.ClipboardManager clipboard = (android.content.ClipboardManager) context
                        .getSystemService(context.CLIPBOARD_SERVICE);
                android.content.ClipData clip = android.content.ClipData
                        .newPlainText(
                                context.getResources().getString(
                                        R.string.message), text);
                clipboard.setPrimaryClip(clip);
            }
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    @SuppressLint("NewApi")
    public String readFromClipboard(Context context) {
        int sdk = android.os.Build.VERSION.SDK_INT;
        if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
            android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context
                    .getSystemService(context.CLIPBOARD_SERVICE);
            return clipboard.getText().toString();
        } else {
            ClipboardManager clipboard = (ClipboardManager) context
                    .getSystemService(Context.CLIPBOARD_SERVICE);

            // Gets a content resolver instance
            ContentResolver cr = context.getContentResolver();

            // Gets the clipboard data from the clipboard
            ClipData clip = clipboard.getPrimaryClip();
            if (clip != null) {

                String text = null;
                String title = null;

                // Gets the first item from the clipboard data
                ClipData.Item item = clip.getItemAt(0);

                // Tries to get the item's contents as a URI pointing to a note
                Uri uri = item.getUri();

                // If the contents of the clipboard wasn't a reference to a
                // note, then
                // this converts whatever it is to text.
                if (text == null) {
                    text = coerceToText(context, item).toString();
                }

                return text;
            }
        }
        return "";
    }

    @SuppressLint("NewApi")
    public CharSequence coerceToText(Context context, ClipData.Item item) {
        // If this Item has an explicit textual value, simply return that.
        CharSequence text = item.getText();
        if (text != null) {
            return text;
        }

        // If this Item has a URI value, try using that.
        Uri uri = item.getUri();
        if (uri != null) {

            // First see if the URI can be opened as a plain text stream
            // (of any sub-type). If so, this is the best textual
            // representation for it.
            FileInputStream stream = null;
            try {
                // Ask for a stream of the desired type.
                AssetFileDescriptor descr = context.getContentResolver()
                        .openTypedAssetFileDescriptor(uri, "text/*", null);
                stream = descr.createInputStream();
                InputStreamReader reader = new InputStreamReader(stream,
                        "UTF-8");

                // Got it... copy the stream into a local string and return it.
                StringBuilder builder = new StringBuilder(128);
                char[] buffer = new char[8192];
                int len;
                while ((len = reader.read(buffer)) > 0) {
                    builder.append(buffer, 0, len);
                }
                return builder.toString();

            } catch (FileNotFoundException e) {
                // Unable to open content URI as text... not really an
                // error, just something to ignore.

            } catch (IOException e) {
                // Something bad has happened.
                Log.w("ClippedData", "Failure loading text", e);
                return e.toString();

            } finally {
                if (stream != null) {
                    try {
                        stream.close();
                    } catch (IOException e) {
                    }
                }
            }

            // If we couldn't open the URI as a stream, then the URI itself
            // probably serves fairly well as a textual representation.
            return uri.toString();
        }

        // Finally, if all we have is an Intent, then we can just turn that
        // into text. Not the most user-friendly thing, but it's something.
        Intent intent = item.getIntent();
        if (intent != null) {
            return intent.toUri(Intent.URI_INTENT_SCHEME);
        }

        // Shouldn't get here, but just in case...
        return "";
    }

}
COMME
la source
Pouvez-vous ajouter les instructions d'importation nécessaires pour faire fonctionner cette classe?
merlin2011
@ merlin2011 l'a fait, je pense avoir oublié la méthode coerceToText (...). Sry for that
AS
Que fait "coerceToText"? est-il également possible de copier / coller d'autres types de données dans le presse-papiers (exemple: bitmap)?
développeur Android
1
@AS pourquoi avez-vous écrit vous-même la méthode corceToText? ! son déjà disponible avec api voir developer.android.com/reference/android/content/…
Hardik
Mais je pense qu'il est temps pour les développeurs de cesser de prendre en charge des choses avant sur API17. Il ne reste plus beaucoup d'unités de types plus âgés et ils n'ont pas tendance à télécharger de nouvelles applications? Par exemple, j'utilise des unités plus âgées pour la navigation dans mon voilier, et tout le reste est essuyé. Cela ne me dérange pas de jeter de telles unités par-dessus bord par erreur?
Jan Bergström
23

En tant qu'extension de kotlin pratique:

fun Context.copyToClipboard(text: CharSequence){
    val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
    val clip = ClipData.newPlainText("label",text)
    clipboard.primaryClip = clip
}

Mettre à jour:

Si vous utilisez ContextCompat, vous devez utiliser:

ContextCompat.getSystemService(this, ClipboardManager::class.java)
crgarridos
la source
1
L'API est désormais remplacée par clipboardManager = getSystemService (context, ClipboardManager :: class.java)
Par Christian Henden
il a en fait changé pour context.getSystemService(ClipboardManager::class.java)vous pointez sur une signature ContextCompat, n'est-ce pas? Merci pour les commentaires
crgarridos
13

Utilisez-le. Cela ne fonctionne que pour Android api> = 11 avant cela, vous devrez utiliser un ClipData.

ClipboardManager _clipboard = (ClipboardManager) _activity.getSystemService(Context.CLIPBOARD_SERVICE);
_clipboard.setText(YOUR TEXT);

J'espère que cela vous a aidé :)

[MISE À JOUR 3/19/2015] Tout comme Ujjwal Singh l'a dit, la méthode setTextest obsolète maintenant, vous devez utiliser, tout comme les docs le recommandent, setPrimaryClip (clipData)

Ektos974
la source
1
C'est le nom de ma variable. Si vous êtes sur votre activité, utilisez simplement (ClipboardManager) this.getSystemService(Context.CLIPBOARD_SERVICE); _clipboard.setText(YOUR TEXT);
Ektos974
1
Obsolète - ne pas utiliser setTextuse ClipData+setPrimaryClip
Ujjwal Singh
1
Pour moi aussi, il montre une erreur lors de l'utilisation de setPrimaryClip
Praneeth
11

Cela peut être fait dans Kotlin comme ceci:

var clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
var clip = ClipData.newPlainText("label", file.readText())
clipboard.primaryClip = clip

file.readText()est votre chaîne d'entrée.

Nikhil Katekhaye
la source
7

utilisez ce code

   private ClipboardManager myClipboard;
   private ClipData myClip;
   TextView textView;
   Button copyText;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mainpage);
    textView = (TextView) findViewById(R.id.textview);
    copyText = (Button) findViewById(R.id.bCopy);
    myClipboard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);

    copyText.setOnClickListener(new View.OnClickListener() {


        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub


           String text = textView.getText().toString();
           myClip = ClipData.newPlainText("text", text);
           myClipboard.setPrimaryClip(myClip);
           Toast.makeText(getApplicationContext(), "Text Copied", 
           Toast.LENGTH_SHORT).show(); 
        }
    });
}
SKG
la source
Merci beaucoup, c'est très facile à utiliser.
iamkdblue
7

utiliser cette fonction pour copier dans le presse-papiers

public void copyToClipboard(String copyText) {
    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(copyText);
    } else {
        android.content.ClipboardManager clipboard = (android.content.ClipboardManager)
                getSystemService(Context.CLIPBOARD_SERVICE);
        android.content.ClipData clip = android.content.ClipData
                .newPlainText("Your OTP", copyText);
        clipboard.setPrimaryClip(clip);
    }
    Toast toast = Toast.makeText(getApplicationContext(),
            "Your OTP is copied", Toast.LENGTH_SHORT);
    toast.setGravity(Gravity.BOTTOM | Gravity.RIGHT, 50, 50);
    toast.show();
    //displayAlert("Your OTP is copied");
}
Vimal Gajera
la source
6
@SuppressLint({ "NewApi", "NewApi", "NewApi", "NewApi" })
@SuppressWarnings("deprecation")
@TargetApi(11)
public void onClickCopy(View v) {   // User-defined onClick Listener
    int sdk_Version = android.os.Build.VERSION.SDK_INT;
    if(sdk_Version < android.os.Build.VERSION_CODES.HONEYCOMB) {
        android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
        clipboard.setText(textView.getText().toString());   // Assuming that you are copying the text from a TextView
        Toast.makeText(getApplicationContext(), "Copied to Clipboard!", Toast.LENGTH_SHORT).show();
    }
    else { 
        android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 
        android.content.ClipData clip = android.content.ClipData.newPlainText("Text Label", textView.getText().toString());
        clipboard.setPrimaryClip(clip);
        Toast.makeText(getApplicationContext(), "Copied to Clipboard!", Toast.LENGTH_SHORT).show();
    }   
}
Himanshu Aggarwal
la source
2

int sdk = android.os.Build.VERSION.SDK_INT;

    if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
        android.text.ClipboardManager clipboard = (android.text.ClipboardManager) DetailView.this
                .getSystemService(Context.CLIPBOARD_SERVICE);
        clipboard.setText("" + yourMessage.toString());
        Toast.makeText(AppCstVar.getAppContext(),
                "" + getResources().getString(R.string.txt_copiedtoclipboard),
                Toast.LENGTH_SHORT).show();
    } else {
        android.content.ClipboardManager clipboard = (android.content.ClipboardManager) DetailView.this
                .getSystemService(Context.CLIPBOARD_SERVICE);
        android.content.ClipData clip = android.content.ClipData
                .newPlainText("message", "" + yourMessage.toString());
        clipboard.setPrimaryClip(clip);
        Toast.makeText(AppCstVar.getAppContext(),
                "" + getResources().getString(R.string.txt_copiedtoclipboard),
                Toast.LENGTH_SHORT).show();
    }
Pankaj Singh
la source
2

utilisez cette méthode:

 ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 
 ClipData clip = ClipData.newPlainText(label, text);
 clipboard.setPrimaryClip(clip);

à la place de setPrimaryClip, nous pouvons également utiliser les méthodes suivantes:

void    clearPrimaryClip()

Efface tout clip principal actuel du presse-papiers.

ClipData    getPrimaryClip()

Renvoie le clip principal actuel dans le presse-papiers.

ClipDescription getPrimaryClipDescription()

Renvoie une description du clip principal actuel dans le presse-papiers mais pas une copie de ses données.

CharSequence    getText()

Cette méthode est obsolète. Utilisez plutôt getPrimaryClip (). Cela récupère le clip principal et essaie de le contraindre à une chaîne.

boolean hasPrimaryClip()

Renvoie true s'il existe actuellement un clip principal dans le presse-papiers.

Pradeep Kumar
la source
1
    String stringYouExtracted = referraltxt.getText().toString();
    android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
    android.content.ClipData clip = android.content.ClipData.newPlainText("Copied Text", stringYouExtracted);

clipboard.setPrimaryClip(clip);
        Toast.makeText(getActivity(), "Copy coupon code copied to clickboard!", Toast.LENGTH_SHORT).show();
Keshav Gera
la source
0

Essayez le code suivant. Il prendra en charge la dernière API:

ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
                        if (clipboard.hasPrimaryClip()) {
                            android.content.ClipDescription description = clipboard.getPrimaryClipDescription();
                            android.content.ClipData data = clipboard.getPrimaryClip();
                            if (data != null && description != null && description.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN))
                            {
                                String url= (String) clipboard.getText();
                                searchText.setText(url);
                                System.out.println("data="+data+"description="+description+"url="+url);
                            }}
Ranjith Guru
la source
0

Méthode d'assistance Kotlin pour attacher cliquez pour copier des textes sur une TextView

Mettez cette méthode quelque part dans la classe Util. Cette méthode attache l'écouteur de clics sur textview pour copier le contenu de textView dans un clipText sur clic de ce textView

/**
 * Param:  cliplabel, textview, context
 */
fun attachClickToCopyText(textView: TextView?, clipLabel: String, context: Context?) {
    if (textView != null && null != context) {
        textView.setOnClickListener {
            val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
            val clip = ClipData.newPlainText(clipLabel, textView!!.text)
            clipboard.primaryClip = clip
            Snackbar.make(textView,
                    "Copied $clipLabel", Snackbar.LENGTH_LONG).show()
        }
    }

}
Hitesh Sahu
la source
0

Vous pouvez effectuer cette fonction de copie dans le presse-papiers lors d'un événement de bouton onclick. alors mettez ces lignes de code à l'intérieur de votre bouton onClickListerner

android.content.ClipboardManager clipboardManager = (android.content.ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
android.content.ClipData clipData = android.content.ClipData.newPlainText("Text Label", ViewPass.getText().toString());
clipboardManager.setPrimaryClip(clipData);
Toast.makeText(getApplicationContext(),"Copied from Clipboard!",Toast.LENGTH_SHORT).show();
Malith Ileperuma
la source
0

Écrivez simplement ce code:

clipboard.setText(getstring);
raza raza
la source
Vous avez oublié d'initialiser clipboard. Mais merci pour setText. Il est obsolète, alors utilisez-le val clip = ClipData.newPlainText(null, text) clipboard.setPrimaryClip(clip).
CoolMind
-1

Pour Kotlin

 ClipboardManager clipboard = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE); 
 ClipData clip = ClipData.newPlainText(label, text);
 clipboard.setPrimaryClip(clip);
Kapil Bansal
la source