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:
- Cómo encontrar la animación ha terminado de jugar en android
- Vista Web de Android: la página web debe ajustarse a la pantalla del dispositivo
- Android - WebView no reproduce videos de YouTube
- Android WebView setCertificate emite problemas de SSL
- Cómo cambiar la cara de la fuente de Webview en Android?
@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?
- Vista web de Android: detección de desplazamiento
- Mi aplicación Android de HTML está perdiendo valores almacenados en localStorage cuando se cierra. ¿Alguien más ve este problema?
- OnKeyDown dentro del fragmento WebView
- ¿WebViewClient y WebChromeClient se excluyen mutuamente?
- Enlace de correo electrónico de Webview (mailto)
- WebSocket en Android WebView
- Habilitación de JavaScript general en WebViewClient
- Android: cómo seleccionar textos de la vista web
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