web-dev-qa-db-fra.com

Quel est exactement le paramètre "label" dans ClipData dans Android?

Selon le Android documentation , ClipData utilise le "label" comme une sorte de représentation des données copiées.

ClippedData est un type complexe contenant une ou des instances d'élément, chacune pouvant contenir une ou plusieurs représentations d'un élément de données. Pour l'affichage à l'utilisateur, il a également une étiquette et une représentation iconique.

Et ensuite, il explique plus en détail "étiquette" comme Étiquette visible par l'utilisateur pour les données de clip dans certains documents API . Cependant, je suis toujours confus quant à l'utilisation de l'étiquette.

Comment cette étiquette est-elle visible pour les utilisateurs? Comment dois-je l'utiliser? Que dois-je définir pour cette étiquette lorsque j'appelle la méthode d'usine ClipData newPlainText(CharSequence label, CharSequence text)? par exemple:

private void copyToClipBoard() {

    ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
    ClipData clip = ClipData.newPlainText(
            "text label", // What should I set for this "label"?
            "content to be copied");
    clipboard.setPrimaryClip(clip);
    Toast.makeText(AboutActivity.this, "Saved to clip board", Toast.LENGTH_SHORT).show();
}
54
hackjutsu
ClipData clip = ClipData.newPlainText(
            "text label", 
            "content to be copied");

ici l'étiquette de texte décrit les données contenues dans le clip

par exemple.

ClipData clip = ClipData.newPlainText(
            "user Name",
            user.getName()); 

nous pouvons revivre cela en utilisant

clip.getDescription ();
55
Gaurav

Il semble que la description "Étiquette visible par l'utilisateur pour les données de clip" dans la documentation doit être interprétée comme quelque chose que vous, en tant que développeur, pouvez définir, puis montrer à l'utilisateur vous-même et non comme quelque chose que le système Android montrera à l'utilisateur.

Lorsque vous regardez le code source Android, la méthode ClipDescription.getLabel () semble être inutilisée avant Android 5.0. Dans 5.0 RemoteInput , RemoteInputCompatJellybean et com.Android.mail.compose.ComposeActivity ont indiqué en utilisant la méthode .

Si vous regardez l'utilisation, tous ces éléments définissent une étiquette qui n'est pas destinée à être vue par l'utilisateur mais utilisée à la place pour identifier par programmation le clip à un endroit différent dans le code.

Lorsque vous regardez comment ClipData.newPlainText () est utilisé dans Android, la plupart du temps, null est donné comme étiquette, suggérant que l'étiquette n'est pas vraiment utilisée pour quoi que ce soit.

Il est bien sûr possible qu'un fabricant de téléphones ou un autre développeur d'application prenne l'étiquette et l'affiche à l'utilisateur dans certaines situations. Mais en général, il devrait être prudent de supposer que l'étiquette d'un clip ne sera montrée à l'utilisateur dans votre application que si vous la montrez vous-même.

21
nibarius

Aujourd'hui, en travaillant sur mon application, j'ai découvert un cas d'utilisation pour le label ClipData. Certaines applications le définissent sur null tandis que d'autres applications l'utilisent à peu près.

Dans le cas de mon application, j'écoute addPrimaryClipChangedListener du ClipManager

Je fais cela dans une classe de service qui s'exécute en arrière-plan presque tout le temps. Je veux traiter les données ajoutées au primaireClip depuis mon application différemment des données ajoutées dans une autre application (disons du texte copié dans un navigateur Web).

Voici un extrait de mon code et comment j'utilise l'étiquette ClipData:

mClipBoardManager.addPrimaryClipChangedListener(new ClipboardManager.OnPrimaryClipChangedListener() {
            @Override
            public void onPrimaryClipChanged() {
                String clipLabel = "default";
                if (mClipBoardManager.getPrimaryClip().getDescription().getLabel() != null) {
                    clipLabel = mClipBoardManager.getPrimaryClip().getDescription().getLabel().toString();
                }
                if (clipLabel.equals("auto_copy_text")) {
                    //TODO: Text from my app do stuffs you will do with text from my app
                } else {
                    //TODO: Text from some other app
                }

            }
        });

Dans mon application, lorsque j'ajoute des données à primaryClip, j'inclus l'étiquette comme ceci:

private void addToClipboard(String text) {
        mClipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
        mClipboardManager.setPrimaryClip(ClipData.newPlainText("auto_copy_text", text));
    }

J'espère que ça aide

0
Eaweb