Android: Abrir un ContextMenu desde onLongPress en WebView personalizado

Actualmente estoy tratando de obtener un WebView personalizado que muestra un ContextMenu cuando se presiona por un tiempo más largo. Como la clase WebView predeterminada sólo muestra un ContextMenu cuando un enlace es longPressed, escribí mi propia clase para anular este comportamiento:

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 se llama el método onLongPress, sin embargo estoy en una pérdida cuando se trata de mostrar el ContextMenu. Intenté 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 me largoPresione el MyWebView en el emulador, no pasa nada. ¿Qué tengo que llamar desde onLongPress () para mostrar el ContextMenu?

Llame a Activity.openContextMenu (Ver v) en onLongPress. Esto significaría tener el MyWebView mantener una referencia a la actividad sin embargo.

Lo tengo trabajando ahora, basándome en la sugerencia de gngr44. Hice que mi actividad implementara la clase OnLongClickListener y proporcionara un método onLongClick() que abra el menú contextual.

El código revisado:

El WebView personalizado:

 public class MyWebView extends WebView { MyActivity theListener; Context context; GestureDetector gd; public MyWebView(Context context, AttributeSet attributes) { super(context, attributes); this.context = context; gd = new GestureDetector(context, sogl); } // This is new public void setListener(MyActivity l) { theListener = l; } @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) { theListener.onLongClick(MyWebView.this); } }; } 

Mi actividad:

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout); MyWebView mwv = (MyWebView) findViewById(R.id.mwv); registerForContextMenu(mwv); } public boolean onLongClick(View v) { openContextMenu(v); return true; } @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); } 

En lugar de acceder a la actividad desde su vista, recomendaría usar una interfaz en su vista e implementarla desde su actividad.

 public class MyWebView extends WebView { private OnLongPressListener mListener; public MyWebView(Context context, AttributeSet attributes) { mListener = (OnLongPressListener) context; } public void onLongPress(MotionEvent event) { mListener.onLongPress(your variables); } public interface OnLongPressListener { public void onLongPress(your variables); } } public class YourActivity extends Activity implements OnLongPressListener { @Override public void onLongPress(your variables) { // handle the longPress in your activity here: } } 

Me di cuenta de que presionar mucho en el emulador requiere un montón de presionar, como 5-7 segundos en contraposición a un 1-2 regular en la vida real. Asegúrese de presionar por lo menos 10 segundos, de lo contrario parece que no pasa nada.

  • No se puede seleccionar la opción en la vista web de android
  • Android WebView no muestra animación javascript
  • Flash en un WebView de Android - problema de capas
  • Androide WebView alternativa para webapps
  • WebView con Flash en un dispositivo 3.1 con la aplicación 2.2
  • La aplicación Android de Alibaba causa bloqueo cuando intenta abrir una URL
  • Cómo cargar una imagen almacenada en una matriz de bytes a WebView?
  • Indicador de actividad de cliente de webview android
  • Android webview y loadData, ¿puedo obtener el botón de regreso para volver al contenido generado?
  • El zoom de la vista de la Web no se enfoca y el niño ve los botones
  • ¿AlertDialog admite WebView?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.