Los identificadores de selección no aparecen en WebView (Android 4.0-4.3)

He creado un ActionMode.Callback personalizado para mostrar una barra de acción contextual personalizada para la selección de texto en un WebView . Funciona maravillosamente en Android 4.4, pero en 4.1-4.3, los controladores de selección no aparecen. Todavía puedo realizar mis operaciones personalizadas en la única palabra que está resaltada, pero la selección no se puede cambiar debido a las manijas que faltan.

Además, cuando se destruye ActionMode , la selección no se borra de la pantalla. Por el contrario, si el usuario pulsa en otro lugar para borrar la selección, el ActionMode no se destruye.

Ni siquiera estoy seguro de que clearFocus() es el método que debería llamar para intentar eliminar la selección. Comencé esa línea y el comportamiento en 4.4 no cambió; todavía funcionaba perfectamente.

¿Qué se puede hacer para solucionar estos problemas?


Esta es mi implementación actual:

 public class CustomWebView extends WebView { private ActionMode.Callback mActionModeCallback; @Override public ActionMode startActionMode(Callback callback) { ViewParent parent = getParent(); if (parent == null) { return null; } mActionModeCallback = new CustomActionModeCallback(); return parent.startActionModeForChild(this, mActionModeCallback); } private class CustomActionModeCallback implements ActionMode.Callback { // Called when the action mode is created; startActionMode() was called @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { // Inflate a menu resource providing context menu items MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.contextual_menu, menu); return true; } // Called each time the action mode is shown. // Always called after onCreateActionMode, but // may be called multiple times if the mode is invalidated. @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { // This method is called when the handlebars are moved. loadJavascript("javascript:getSelectedTextInfo()"); return false; // Return false if nothing is done } // Called when the user selects a contextual menu item @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch(item.getItemId() { case R.id.button_1: // do stuff break; case R.id.button_2: // do stuff break; ... // cases for other buttons default: break; } mode.finish(); // Action picked, so close the CAB return true; } // Called when the user exits the action mode @Override public void onDestroyActionMode(ActionMode mode) { // TODO This does not work in 4.3 (and probably anything older). clearFocus(); // Remove the selection highlight and handles. } } } 

Nunca me imaginé lo que estaba haciendo incorrectamente que estaba causando este comportamiento. Afortunadamente, encontré una solución que muestra el manillar apropiadamente y permite acciones personalizadas. Esa solución se puede encontrar en esta pregunta: https://stackoverflow.com/a/22391169/2608235

En resumen, en lugar de crear su propio ActionMode , elimine las acciones de selección predeterminadas (copiar, pegar, etc) y reemplácelas con su propio layout MenuInflater usando MenuInflater dentro de una anulación de onActionModeStarted . Definir un onClick para los elementos del menú, implementar ese método en su Activity , y ya está.

  • <Embed> en HTML cargado por Webview Broken in Sense UI
  • Se rehusó a mostrar un marco porque establecía X-Frame-Options en 'DENY en android webview
  • Guardar el estado de un WebView y volver a cargar la posición
  • Mostrar círculo de actividades antes de cargar la vista web - Android
  • ¿Hay una manera de pasar un mensaje de un navegador de Android a una aplicación?
  • ¿Cómo puedo eliminar el fondo blanco de una vista web?
  • Android: gran aumento de tamaño de apk cuando se utiliza el navegador de cruce de peatones
  • No se puede cargar la página web con WebView en Android
  • Youtube Video en WebView no se carga
  • Añadir indicador de carga / barra de progreso a Phonegap Pantalla de bienvenida de Android
  • Rendimiento del androide Sencha Touch 2
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.