Actualmente estoy tratando de obtener un WebView personalizado que muestre un ContextMenu cuando se presiona por un tiempo más prolongado. A medida que la clase WebView por defecto sólo muestra un ContextMenu cuando se longPressed un enlace, escribí mi propia clase para anular este comportamiento:Android: abrir un ContextMenu desde onLongPress en WebView personalizado
public class MyWebView extends WebView {
Context context;
GestureDetector gd;
public MyWebView(Context context, AttributeSet attributes) {
super(context, attributes);
this.context = context;
gd = new GestureDetector(context, sogl);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return gd.onTouchEvent(event);
}
GestureDetector.SimpleOnGestureListener sogl =
new GestureDetector.SimpleOnGestureListener() {
public boolean onDown(MotionEvent event) {
return true;
}
public void onLongPress(MotionEvent event) {
// The ContextMenu should probably be called here
}
};
}
Esto funciona sin problemas el LongPress se detecta y el método onLongPress se llama, sin embargo estoy a pérdida cuando se trata de mostrar el ContextMenu. He intentado hacerlo de la manera habitual en mi Actividad:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout);
MyWebView mwv = (MyWebView) findViewById(R.id.mwv);
registerForContextMenu(mwv);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.context, menu);
}
Sin embargo, cuando el LongPress MyWebView en el emulador, no pasa nada. ¿A qué tengo que llamar desde onLongPress() para visualizar ContextMenu?
Esto hace que el menú contextual funcione. Sin embargo, ya no puedo desplazarme por la página web. En realidad, cualquier toque emergerá el menú contextual. ¿Alguna idea de cómo hacer que funcione perperly? – newman
Lo mismo aquí, la vista web pierde su capacidad de desplazamiento – KingFu
Creo que se debe a que ha anulado el evento onTouch pero no ha implementado la superclase. @Override public boolean onTouchEvent (evento MotionEvent) { if (gestureDetector.onTouchEvent (event)) return true; return super.onTouchEvent (evento); } El código proporcionado debería ser el truco :) –