Deshabilitar el menú de selección contextual en el paso de peatones (cordova)
Deseo deshabilitar el menú contextual nativo que se muestra al seleccionar un texto, el que tiene los botones Seleccionar todo , Copiar , Compartir y Buscar . No obstante, no deseo desactivar las selecciones. Idealmente, me gustaría ampliar el menú en realidad, pero honestamente, estoy más que perfectamente bien con sólo desactivar. Con textfields y similares tiende a ser relativamente simple de la documentación que encontré, pero no puedo encontrar una manera de hacer que esto funcione con XWalkView
/ CordovaWebView
. Podría ser que estoy buscando en completamente la esquina equivocada sin embargo.
- Android: Recuperando el enfoque con SurfaceView
- Superponiendo un lienzo en la parte superior de una vista de superficie, Flashes
- Error al usar ScrimInsetFrameLayout
- Cómo encontrar la "última página" en un paginador de vista. O el número total de puntos de vista. Desarrollo de Android
- Intentando ejecutar pruebas triviales de JUnit para Android. Obtención: "Error de prueba: No hay resultados de prueba" ¿Qué me falta?
- Administrador de alarmas de Android
- Content Observer onChange método llamado dos veces después de 1 cambio en el cursor
- ¿Cómo puedo generar un número aleatorio en un rango específico en Android?
- Cómo hacer referencia a una vista en una notificación personalizada
- Cómo mantener a mi clase de ofuscar por proguard
- ¿Qué es la consola.log () de java?
- Activity_main no puede ser resuelto o no es un campo
- el enlace de datos; la etiqueta de la vista no es correcta, Android
Tengo una solución.
Para WebView
hay una solución, pero no funciona para XWalkView
:
Solución del menú de selección de WebView
Mi gradle incluye compile 'org.xwalk:xwalk_core_library:14.43.343.17'
Mi solución, la idea principal en el método onAttachedToWindow
:
public class XWalkWebView extends XWalkView { public XWalkWebView(Context context, AttributeSet attrs) { super(context, attrs); } private ActionMode.Callback mOriginalCallback; @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); try { View innerChild = ((ViewGroup) getChildAt(0)).getChildAt(0); Field contentViewField = innerChild.getClass().getDeclaredField("mContentView"); contentViewField.setAccessible(true); XWalkContentView xWalkContentView = (XWalkContentView) contentViewField.get(innerChild); Field contentViewCoreField = xWalkContentView.getClass().getSuperclass().getDeclaredField("mContentViewCore"); contentViewCoreField.setAccessible(true); ContentViewCore viewCore = (ContentViewCore) contentViewCoreField.get(xWalkContentView); viewCore.setContainerView(this); } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } } @Override public ActionMode startActionMode(ActionMode.Callback callback) { mOriginalCallback = callback; ActionMode.Callback c = new // your callback... return super.startActionMode(c); } }
Intento la solución de Warabei pero no funciona en 15.44.384.13. Mejore para encontrar versiones cruzadas de ContentViewCore:
public class XWalkWebView extends XWalkView { ... private Field getFields(Class clazz){ for(Field field:clazz.getDeclaredFields()){ if(ContentViewCore.class == field.getType()){ return field; } } clazz = clazz.getSuperclass(); if(clazz!=null && clazz!=Object.class){ Field field = getFields(clazz); if(field!=null)return field; } return null; } private void inject(View view){ Field field = getFields(view.getClass()); if(field!=null){ field.setAccessible(true); try { ContentViewCore viewCore = (ContentViewCore) field.get(view); viewCore.setContainerView(this); return; }catch(Exception e){ } } if(view instanceof ViewGroup){ ViewGroup viewGroup = (ViewGroup)view; int count = viewGroup.getChildCount(); for(int i = 0;i<count;i++){ inject(viewGroup.getChildAt(i)); } } } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); inject(this); } ...
Para deshabilitar el menú de selección contextual:
@Override public ActionMode startActionMode(ActionMode.Callback callback) { return new ActionMode() { @Override public void setTitle(CharSequence charSequence) { } @Override public void setTitle(int i) { } @Override public void setSubtitle(CharSequence charSequence) { } @Override public void setSubtitle(int i) { } @Override public void setCustomView(View view) { } @Override public void invalidate() { } @Override public void finish() { } @Override public Menu getMenu() { return null; } @Override public CharSequence getTitle() { return null; } @Override public CharSequence getSubtitle() { return null; } @Override public View getCustomView() { return null; } @Override public MenuInflater getMenuInflater() { return null; } }; }
Este CSS debe evitar los menús contextuales tanto en Android como en IOS, como se indica en la plantilla cordova
* { -webkit-tap-highlight-color: rgba(0,0,0,0); /* make transparent link selection, adjust last value opacity 0 to 1.0 */ } body { -webkit-touch-callout: none; /* prevent callout to copy image, etc when tap to hold */ -webkit-text-size-adjust: none; /* prevent webkit from resizing text to fit */ -webkit-user-select: none; /* prevent copy paste, to allow, change 'none' to 'text' */ }
- Necesidad de diseñar el diseño de la arquitectura de una aplicación Android
- Problemas de duración de la trama de AnimationDrawable