viernes, 24 de octubre de 2014

WebView

WebView permite crear una ventana personalizada dentro del interfaz gráfico de la app para la visualización de código HTML, ya sea directamente cargado desde un String o proveniente de una página web.
Se suele emplear para mostrar contenido enriquecido de forma sencilla, o para acceder a una web sin salir de la app.

Compatibilidad

v1

Lo mínimo necesario

Un layout con un WebView.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <WebView
        android:id="@+id/wvWeb"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

Cargar el WebView con el código HTML:
//El método loadDataWithBaseURL respeta los caracteres latinos
WebView wv = (WebView) view.findViewById(R.id.wvWeb);
wv.loadDataWithBaseURL(null, texto, "text/html", "UTF-8", null);

En el caso de acceder a una web externa es necesario permiso de Internet en el Manifest.
<uses-permission android:name="android.permission.INTERNET"/>

Cargar la URL en el WebView:
WebView wv = (WebView) view.findViewById(R.id.wvWeb);
wv.getSettings().setJavaScriptEnabled(true);
wv.loadUrl("http://www.google.es");

WebViewClient

WebView tiene gran cantidad de opciones configurables como activar zoom (setSupportZoom) o modificar el tamaño de fuente (setTextSize). El método loadUrl carga la dirección deseada.
Si se busca que WebView se comporte como un navegador completo y se puedan seleccionar los enlaces manteniendo el control la app se debe implementar un WebViewClient.
Para ello simplemente añadir una clase que herede de WebWiewClient encargada de cargar los enlaces:
private class Client extends WebViewClient {
            
       /**
        * Este método permite interceptar URLs no deseadas
        * @return false si la app no debe cargar la URL
        */
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
             return true;
       }
}

Configurar el WebView para que utilice el WebViewClient anterior.
wv.setWebViewClient(new Client());

Por último, para que el navegador esté completo es necesario que el botón back responda como un atrás del navegador invocando al método goBack() del WebView. Si el WebView está gestionado desde una Activity resulta muy sencillo (los fragments no tienen posibilidad de sobrescribir onBackPressed).
@Override
public void onBackPressed() {          
       if (wv.canGoBack()){
             //Volver a la página anterior si se había navegado
             wv.goBack();
       }else{
             super.onBackPressed();
       }
}

Referencias


6 comentarios:

  1. No me funciona el botón Back, me genera un error y sale de la aplicación.

    @Override
    public void onBackPressed() {
    if (wv.canGoBack()){
    //Volver a la página anterior si se había navegado
    wv.goBack();
    }else{
    super.onBackPressed();
    }
    }

    ResponderEliminar
    Respuestas
    1. Prueba a poner el siguiente código en la primera línea de ese método:
      WebView wv = (WebView) view.findViewById(R.id.wvWeb);

      Seguramente el problema es que en ese método la variable wv sea null porque la hayas definido como atributo de la clase pero no la hayas inicializado como tal y por tanto se te produce un NullPointerException, de cualquier forma si el error persiste y me pasas traza de error quizás pueda ayudarte mejor

      Eliminar
    2. hola
      en amdroid 2.3 los inputs no permiten acceder a teclado. solo hat que minimizar la aplicacion....maximizar y solo ahi toma....solo para inputs...

      tienes algun codigo en html que permita minimizar y maximizar la app de android desde un href con html?

      o la otra forma que se me ocurre es activar con mailto o tel en html...lo he hecho y eso supera el bug del input pero no se como poder cerrar la .....
      saplicacion del email o del telefono mediante html

      Eliminar
    3. Buenas Alberto,
      disculpa pero hasta el momento no había leído tu comentario, no he logrado conseguir un código como el que me referías, me pregunto si pudiste solucionarlo y cómo.
      Gracias

      Eliminar
    4. No.
      Al parecer es un error de android version 2 al 3
      Loq ue hice fue generar una apertura del email luego de unos segundos de haber abierto el programa, para que asi el usuario tenga que si o si devolverse con el boton retroceso. Desde ese instante no hay problemas en tener que usar la app.

      Eliminar