¿Cómo utilizar la nueva función de Android M de "Selección de texto" que se ofrece desde fuera de la aplicación?
Fondo
Android M presenta una nueva forma de manejar el texto seleccionado (enlace aquí ), incluso desde fuera de su aplicación. La selección de texto se puede manejar como tal:
- Listado de la actividad de una aplicación y los filtros de intención?
- Android: Cambiar la etiqueta de la aplicación mediante programación
- Compatible-pantalla aparece después de la etiqueta de aplicación?
- ¿Es posible configurar System DateTime de mi aplicación para Android?
- No se encontró ningún recurso que coincida con el nombre dado (en 'layout_alignTop' con el valor '@ id / imageView3')
Sé que es posible manejar el texto seleccionado desde fuera de la aplicación, porque si voy al navegador web (o cualquier otro lugar que permita la selección de texto), puedo ver que puedo usar la aplicación "demos API" para manejar el archivo seleccionado texto.
El problema
No puedo ver mucha información sobre cómo hacerlo.
La pregunta
- ¿Qué se debe agregar en el código (y el manifiesto) para poder manejar el texto seleccionado desde fuera de la aplicación?
- ¿Es posible limitar la selección a ciertos tipos de textos? Por ejemplo, ¿ofrecer para mostrar la aplicación sólo si el tipo de texto es un número de teléfono válido?
- Permiso de manifiesto en Android Studio
- Java.lang.RuntimeException: No se puede instanciar la actividad
- ¿Cómo puedo hacer que mi aplicación aparezca en tablets
- Manifiesto del proceso Gradle con la nueva fusión de manifiesto
- Configuración persistente del nombre predeterminado en un proyecto de Android en Eclipse
- No se encontró actividad de Lanzador, a pesar de haber sido declarada en manifest.xml
- Aplicación con 2 actividades de lanzamiento
- ¿Qué es android: sharedUserLabel y qué valor agregado agrega en la parte superior de android: sharedUserID?
En primer lugar, para aclarar la pregunta: En un emulador M, si resalta texto, verá el nuevo modo de acción flotante. Si hace clic en el icono de desbordamiento, aparecerá "API DEMOS":
Al hacer clic en esta opción, se muestra una actividad de la aplicación API Demos, que muestra el texto resaltado:
Al reemplazar el valor en el campo y al hacer clic en el botón, se coloca el texto de reemplazo como reemplazo de lo que haya resaltado.
ADVERTENCIA : La explicación siguiente es de inspeccionar el código de demostraciones API y la documentación de M Developer Preview. Es muy posible que esto cambie antes de que M envíe para realz. YMMV, a menos que utilice el sistema métrico, en cuyo caso YKMV.
La actividad en cuestión, que recibe el texto, admite ACTION_PROCESS_TEXT
como acción de Intent
. EXTRA_PROCESS_TEXT
guardará algún texto, o EXTRA_PROCESS_TEXT_READONLY
lo mantendrá si el texto es de sólo lectura. La actividad se invocará a través de startActivityForResult()
. El resultado Intent
puede tener su propio valor EXTRA_PROCESS_TEXT
, que será el texto de reemplazo.
Por lo tanto, a las preguntas específicas:
¿Qué se debe agregar en el código (y el manifiesto) para poder manejar el texto seleccionado desde fuera de la aplicación?
Véase más arriba. Tenga en cuenta que la actividad de API Demos ( ProcessText
) tiene este <intent-filter>
:
<intent-filter > <action android:name="android.intent.action.PROCESS_TEXT"/> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter>
La documentación no describe un tipo MIME. No he realizado ningún experimento para determinar si se requiere el tipo MIME, y qué más podemos obtener ( text/html
para cosas que tiene spans?).
¿Es posible limitar la selección a ciertos tipos de textos? Por ejemplo, ¿ofrecer para mostrar la aplicación sólo si el tipo de texto es un número de teléfono válido?
Eso no parece ser posible dada la documentación. Dicho esto, es ciertamente una idea razonable (por ejemplo, anunciar un regex, o múltiples regexes, a través de metadatos en el manifiesto que el texto debe coincidir).
Este artículo en el blog de desarrolladores de Android puede ser relevante. Describe cómo se puede agregar la opción Google Traductor al menú de selección de texto de desbordamiento.
Las aplicaciones de Android que utilizan el comportamiento de selección de texto de Android ya tendrán activada esta función, por lo que no es necesario tomar medidas adicionales. Los desarrolladores que crearon un comportamiento de selección de texto personalizado para sus aplicaciones pueden implementar fácilmente esta característica siguiendo los siguientes pasos:
Escanear a través de PackageManager a través de todos los paquetes que tienen el filtro de intención
PROCESS_TEXT
(por ejemplo:com.google.android.apps.translate
– si está instalado) y agregarlos como MenuItems a las selecciones de TextView para su aplicaciónPara consultar el gestor de paquetes, primero construya una intención con la acción
Intent.ACTION_PROCESS_TEXT
, luego recupere las actividades soportadas y añada un elemento para cada actividad recuperada y asigne una intención para iniciar la acción
public void onInitializeMenu(Menu menu) { // Start with a menu Item order value that is high enough // so that your "PROCESS_TEXT" menu items appear after the // standard selection menu items like Cut, Copy, Paste. int menuItemOrder = 100; for (ResolveInfo resolveInfo : getSupportedActivities()) { menu.add(Menu.NONE, Menu.NONE, menuItemOrder++, getLabel(resolveInfo)) .setIntent(createProcessTextIntentForResolveInfo(resolveInfo)) .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); } }
- Uso de IntelliJ con complemento de Android, en lugar de usar Android Studio
- GetActivity () causa RuntimeException: No se pudo iniciar intención Intent act = android.intent.action.MAIN