Detectar y capturar pulsaciones en la pantalla de nuestro WebView con Android Studio.
Hace unos dias os expliqué la manera de crear una estupenda app Android a partir de una WebApp. Muchos de nosotros no somos expertos en Android o Java y programamos en PHP y el resto de lenguajes.
Pero claro, ya sabemos que hoy en dia, con el uso que le damos a nuestros teléfonos, todo lo queremos en app. Y claro, cuando te has tirado horas y horas frente al ordenador programando una aplicación, lo último que quieres oir es :
» ¿Y cómo me la descargo, no está en Google Play? «…
Yo he realizado ya varias aplicaciones que estoy a punto de subir a Google Play.
Pero en la última me encontré con un problema muy gordo. Os cuento:
Cuando tienes acaba tu aplicación, una de las pruebas que has de hacer es qué pasa cuando el usuario está sin conexión a internet. Si eso pasara, el mensaje que le sale es horrendo y muy poco profesional.
Es muy facil con Android Studio hacer una comprobación de la conexión a internet del usuario antes de iniciar la app y, en el caso de que no estuviera conectado mostrar una imagen o archivo HTML creado para ese efecto.
Por si os puede ser útil, aquí os dejo el código que yo utilizo en mis apps. Es muy simple y eficiente.
//---DETECTA LA CONEXION A INTERNET AL INICIAR LA APLICACION--------------------------- ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isConnected()) { //Si hay conexión, carga nuestra webview webView.loadUrl("https://mi web/index.html"); } else { //Si no la hay, carga una web de error interna. webView.loadUrl("file:///android_asset/error.html"); } //-------------------------------------------------------------------------------------
Pero ese no era mi problema. Mi problema era…
¿Y si el usuario se queda sin acceso a internet mientras utiliza la App?.
Busqué mucho y todos me enviaban a la misma función:
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { // custom error handling ... show and alert or toast or something }
Pues que sepais que NO FUNCIONA. O al menos, a mí no me funcionó (no descarto que fuera culpa mía).
Por lo que parece, la funcion onReceivedError() ya no funciona y , por lo que me pareció entender, en en WebView tampoco funcionaba. Pero, en cualquier caso, no importa. HAY QUE SER PERSISTENTES.
Y tras muchas horas leyendo blogs y web de gente que me daban la misma solución, al final encontré ésta. Por fin. La definitiva y 100% funcional.
Este código sí detecta las pulsaciones en la pantalla cuando usamos un WebView.
Si poneis en vuestra app el código tal cual, cada vez que pulseis en la pantalla de vuestro móvil habiendo cargado un WebView, os aparecerá un mensaje que dice «WebView pressed»;
Aquí lo tenéis:
final Boolean[] mMoveOccured = new Boolean[1]; final float[] mDownPosX = new float[1]; final float[] mDownPosY = new float[1]; final float MOVE_THRESHOLD_DP = 20 * getResources().getDisplayMetrics().density; userPic.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { final int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: mMoveOccured[0] = false; mDownPosX[0] = event.getX(); mDownPosY[0] = event.getY(); break; case MotionEvent.ACTION_UP: if (!mMoveOccured[0]) { //Aquí hemos detectado la pulsación Toast.makeText(v.getContext(), "Webview pressed", Toast.LENGTH_SHORT).show(); } break; case MotionEvent.ACTION_MOVE: if (Math.abs(event.getX() - mDownPosX[0]) > MOVE_THRESHOLD_DP || Math.abs(event.getY() - mDownPosY[0]) > MOVE_THRESHOLD_DP) { mMoveOccured[0] = true; } break; } return false; } });
Yo he implementado este código añadiéndole simplemente esta linea:
Toast.makeText(v.getContext(), "Connection Lost", Toast.LENGTH_SHORT).show(); finish()
Estas lineas cierran la aplicación a la vez que muestran el mensaje de que se ha perdido la conexión. Lógicamente tú puedes explayarte todo lo que creas o necesites. Para mí era suficiente asegurarme de que esos mensajes no aparecieran.
Antes que nada quiero dejar claro que estoy seguro de que habrá otras maneras mas eficiente o correctas de realizar estas programaciones. Pero este blog es para gente que empieza y que, aunque no tenga grandes conocimientos, quiere avanzar con sus propias herramientas.
Os puedo asegurar que estoy aprendiendo mucho Java simplemente buscando soluciones a mis problemas o dificultades.
Espero que os sirva de ayuda. Hasta pronto. No olvideis comentar.