¿Qué es exactamente el parámetro "etiqueta" en ClipData en Android?

79

Según la documentación de Android , ClipData usa "etiqueta" como una especie de representación de los datos copiados.

ClippedData es un tipo complejo que contiene una instancia de Item, cada una de las cuales puede contener una o más representaciones de un elemento de datos. Para mostrar al usuario, también tiene una etiqueta y una representación icónica.

Y luego explica con más detalle "etiqueta" como etiqueta visible para el usuario para los datos del clip en algunos documentos API . Sin embargo, todavía estoy confundido sobre el uso de la etiqueta.

¿Cómo pueden ver esta etiqueta los usuarios? ¿Cómo debo usarlo? ¿Qué debo configurar para esta etiqueta cuando llamo al método de fábrica ClipData newPlainText(CharSequence label, CharSequence text)? por ejemplo:

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();
}
hackjutsu
fuente

Respuestas:

87
ClipData clip = ClipData.newPlainText(
            "text label", 
            "content to be copied");

aquí la etiqueta de texto describe qué datos hay en el clip

p.ej.

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

podemos recuperar esto usando

clip.getDescription ();
Gaurav
fuente
4
¿Los términos Useren los documentos "Etiqueta visible para el usuario para los datos del clip" realmente se refieren a los desarrolladores en lugar de a los usuarios de la aplicación? No veo ningún valor para que los usuarios de la aplicación conozcan esta etiqueta ...
hackjutsu
39
La etiqueta está disponible solo para desarrolladores, no para usuarios de aplicaciones
Gaurav
3
¡Agradable! Estaba confundido por la descripción "Visible para el usuario" ... Pero ahora está claro.
hackjutsu
24

Parece que la descripción de "Etiqueta visible para el usuario para los datos del clip" en la documentación debe interpretarse como algo que usted, como desarrollador, puede configurar y luego mostrar al usuario usted mismo y no como algo que el sistema Android le mostrará al usuario.

Al mirar el código fuente de Android, el método ClipDescription.getLabel () parece no usarse antes de Android 5.0. En 5.0 RemoteInput , RemoteInputCompatJellybean y com.android.mail.compose.ComposeActivity declararon usando el método .

Si observa el uso, todos estos establecen una etiqueta que no está destinada a ser vista por el usuario, sino que se usa para identificar programáticamente el clip en un lugar diferente del código.

Al mirar cómo ClipData.newPlainText () se utiliza dentro de Android, la mayor parte del tiempo nulo se da como etiqueta, lo que sugiere que la etiqueta no es realmente utilizado para cualquier cosa.

Por supuesto, es posible que algún fabricante de teléfonos o algún otro desarrollador de aplicaciones tome la etiqueta y se la muestre al usuario en alguna situación. Pero, en general, debería ser seguro asumir que la etiqueta de un clip solo se mostrará al usuario en su aplicación si la muestra usted mismo.

nibarius
fuente
2

Hoy, mientras trabajaba en mi aplicación, descubrí un caso de uso para la etiqueta ClipData. Algunas aplicaciones lo establecen en nulo, mientras que otras aplicaciones lo usan bastante.

En el caso de mi aplicación, estoy escuchando el ClipManager addPrimaryClipChangedListener

Estoy haciendo esto en una clase de servicio que se ejecuta en segundo plano casi todo el tiempo. Quiero tratar los datos agregados al clip primario desde dentro de mi aplicación de manera diferente a los datos agregados en otra aplicación (digamos texto copiado en un navegador web).

Aquí hay un extracto de mi código y cómo estoy usando la etiqueta 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
                }

            }
        });

En mi aplicación, cuando agrego datos a primaryClip, incluyo la etiqueta como esta:

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

espero que esto ayude

Eaweb
fuente