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.

  • Teclado suave de Android no panorámico vista web
  • ¿El método loadUrl de WebView se ejecuta en un subproceso de UI?
  • Vista web de Android con geolocalización de HTML 5
  • Inyección de puente Javascript en WebView
  • ¿Cómo anular algunos eventos de gestos en una webview, pero dejar que otros a través de?
  • No vuelva a cargar el vídeo de la web en rotación
  • Rendimiento del androide Sencha Touch 2
  • Cómo enviar datos POST con código en una vista web de Android
  • Múltiples WebViews en ScrollView dando problemas (Android)
  • La descarga de WebView abre la ventana del navegador por un breve momento antes de volver a WebView
  • Interceptar solicitud de fuente de video HTML5 en Android WebView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.