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:
- Vista web de Android con geolocalización de HTML 5
- Uso de navigator.geolocation.getCurrentPosition en WebView en Android 2.0+ (relacionado con PhoneGap)
- ¿Qué se considera onPageFinished en el WebViewClient para Android?
- La vista web de Android se aplica demasiado lentamente.
- android webview muestra youtube.com/tv video en pantalla completa
@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?
- Depuración de una WebView de Android desde el PC mediante adb
- Cómo recuperar y modificar el contenido HTML de WebView con Http Post
- Ocultar / Mostrar la barra de herramientas cuando se desplaza el fragmento en las pestañas
- ¿Cómo anular algunos eventos de gestos en una webview, pero dejar que otros a través de?
- Android: reducción de la calidad de los píxeles en las imágenes cargadas en WebView
- ¿Por qué se detiene el Javascript cuando presiona mucho tiempo en un dispositivo Android o iOS?
- Android WebClient, devolver un recurso de imagen a través de WebResourceResponse - no mostrar la imagen
- Comunicación entre webview y código nativo en una aplicación para móviles
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.
- El botón de creación de Android emite programaticamente
- ERROR: opción desconocida '–no-crunch' – error AAPT