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+A
puis Menu+C
de copier la valeur, mais comment procéder par programmation?
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+A
puis Menu+C
de copier la valeur, mais comment procéder par programmation?
Réponses:
Utilisez la 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);
import android.content.ClipboardManager;
label
?
Context context = getApplicationContext(); Toast.makeText(context, "text copied", Toast.LENGTH_LONG).show();
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" />
label
in newPlainText
? déclare la documentaion label User-visible label for the clip data.
. Mais quand est-il label
visible pour l'utilisateur? Et quel type de valeur / nom dois-je mettre label
?
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.ClipboardManager
et pour API> = 11 android.content.ClipboardManager
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 ..
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());
}
}
}
À 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.)
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", selectedText);
if (clipboard == null || clip == null) return;
clipboard.setPrimaryClip(clip);
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;
}
android.content.ClipboardManager
version plutôt que l'ancienne android.text.ClipboardManager
. Pareil pourClipData
.context.getSystemService()
.null
. Vous pouvez vérifier chacun d'eux si vous trouvez cette façon plus lisible.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.
@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
text
le texte réel du clip. Selon les documents officiels .
Il est important d'utiliser cette importation:
import android.content.ClipboardManager;
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);
}
}
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)
}
context.
était la partie que je manquais - pourrait être parce que je le fais dans un fragment.