AlertDialog llama WebView



Nuestro es objetivo es apretar un botón y nos aparezca esta pantalla.
La pregunta que nos podríamos de hacer antes de seguir, para que usar un alertDialog y no hacer una simple llamada
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("www.google.com.ar")));

La respuesta es simple, porque con la línea de código anterior, SALIMOS de nuestra aplicación para entrar al navegador (chrome) y entrar a www.google.com.ar (o cualquier otra url que nosotros pongamos).
Y eso es un problema, si el usuario sale de nuestra app, es muy posible que no vuelva, porque a lo mejor ya se engancha con otra cosa y después otra y se fue.
La idea siempre es que este en la app y nunca salga, a menos que intencionalmente quiera hacerlo.

Entonces, para ello vamos a llamar "navegador" pero sin salirnos de nuestro app. Esto es muy parecido a lo que hace Fabook, cuando clickeamos en las fotos, llama a un alert vemos las foto, y cuando apretamos escape, volvemos a donde estabamos.

Lo que tenemos que hacer llamar a esta función
webViewResultados(); 

Código:
private void webViewResultados() {
        AlertDialog.Builder alert = new AlertDialog.Builder(
                getApplicationContext());
        //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

        //alert.setTitle("Resultados Salomon k21");

        WebView wv = new WebView(getApplicationContext());
        wv.getSettings().setJavaScriptEnabled(true);
        wv.loadUrl("https://docs.google.com/spreadsheets/d/1VvjXWpiQWvxH7iD9E4g0dq0Fm-JeV_Sm1y-_afDAb5Q/pubhtml");
        wv.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view,
                                                    String url) {
                view.loadUrl(url);

                return true;
            }
        });

        alert.setNegativeButton("Close",
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {
                    }
                });
        Dialog d = alert.setView(wv).create();
        d.show();
        WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
        lp.copyFrom(d.getWindow().getAttributes());
        lp.width = WindowManager.LayoutParams.FILL_PARENT;
        lp.height = WindowManager.LayoutParams.FILL_PARENT;
        d.getWindow().setAttributes(lp);
    }

Si tienen problemas con el redimensionamiento verticual cuando rotan la pantalla pueden comentar
//                lp.height = WindowManager.LayoutParams.FILL_PARENT;

Ejemplo completo
Prueba.java
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.WindowManager;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;

public class Prueba extends ActionBarActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        this.setContentView(R.layout.prueba);
        //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        Button btnPrueba = (Button) findViewById(R.id.buttonPrueba);
        btnPrueba.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder alert = new AlertDialog.Builder(
                        Prueba.this);
                //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                //alert.setTitle("Resultados Salomon k21");

                WebView wv = new WebView(Prueba.this);
                wv.getSettings().setJavaScriptEnabled(true);
                wv.loadUrl("https://docs.google.com/spreadsheets/d/1VvjXWpiQWvxH7iD9E4g0dq0Fm-JeV_Sm1y-_afDAb5Q/pubhtml");
                wv.setWebViewClient(new WebViewClient() {
                    @Override
                    public boolean shouldOverrideUrlLoading(WebView view,
                                                            String url) {
                        view.loadUrl(url);

                        return true;
                    }
                });

                alert.setNegativeButton("Close",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int id) {
                            }
                        });
                Dialog d = alert.setView(wv).create();
                d.show();
                WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
                lp.copyFrom(d.getWindow().getAttributes());
                lp.width = WindowManager.LayoutParams.FILL_PARENT;
//                lp.height = WindowManager.LayoutParams.FILL_PARENT;
                d.getWindow().setAttributes(lp);
            }
        });

        //WebView myWebView = (WebView) findViewById(R.id.webView);
        //myWebView.loadUrl("https://amatellanes.wordpress.com/");

    }
}

prueba.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Button"
        android:id="@+id/buttonPrueba" />
</LinearLayout>

No se olviden de habilitar conexiones de internet en el AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />

Nota: Si les sale el error
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application

cambien el
getApplicationContext()

por el nombre de la clase.this por ejemplo
Prueba.this

5 comentarios:

  1. disculpa y si quisiera ver una lista de los videos de youtube pero sin entrar en internet,alguna forma??

    ResponderEliminar
  2. Podes descargarlos con aTube Catcher

    ResponderEliminar
  3. Como llamo este layout prueba.xml desde el main?

    ResponderEliminar
  4. hola. quisiera saber como se hace para colocar un link en un alert dialog pero no quiero colocar etiquetas de html, mi idea es hacer funcionar un link que obtengo desde un metodo ejemplo p.getPortaWeb este lo que hace es traer la url desde un webservice. quiero hacer funcionar ese link cuando le de clic en el enlace que aparece en el alert dialog.
    gracias de ante mano.

    ResponderEliminar