Cómo abrir varias URL en un mismo WebView Fragment (Java)

Abrir varias URL en un mismo WebView o, cambiar la URL por defecto con sólo oprimir un botón, es algo que se puede hacer sin tener que hacer muchas maromas o recurrir a escribir mucho código. Esto es realmente útil para una app que tiene muchos enlaces, pues podrás ahorrar mucho en el peso de la aplicación y, en el tiempo de desarrollo; teniendo en cuenta que no tendrás que crear un WebView para cada enlace y, el código usado será muchísimo menor.

Si llegaste hasta aquí buscando una solución a esta duda, es porque ya debes tener una noción del desarrollo de Apps Android en Java, por lo que no voy a alargar el artículo innecesariamente, explicando la creación de un WebView y de los botones. Además, es algo que puedes crear y configurar a tu gusto.

Cómo abrir varias URL en un mismo WebView Fragment (Java)

Esto también funciona con un ListView o cualquier elemento que uses para abrir un enlace al darle clic.

Requisitos previos para crear un WebView para todos los enlaces de tu App

Debes tener tu proyecto creado, con sus respectivos fragments y crear obviamente el WebView Fragment, que servirá para abrir todos los enlaces que quieras.

Cómo cambiar la URL de destino de un WebView pulsando un botón

Una vez tengas listo tu Fragment WebView, con su código adaptado a tu gusto, lo primero que debes hacer, es cambiar el funcionamiento del método webView.LoadUrl(), que ya no tendrá una URL predeterminada, sino que lo modificarás de la siguiente manera:


 if (getArguments() != null) {
            String url = getArguments().getString("url");
            if (url != null) {
                webView.loadUrl(url);
            }
        } 

Ya con esto hecho, irás hasta el MainActivity a configurar lo que será el intercambio de URL para el WebView. Para esto, debes crear un método público, que abra el Fragment y que, además, le pase el parámetro args al fragmento, que será el que se encargue de entregar cada uno de los enlaces que quieras abrir. Queda de la siguiente forma:


public void openLinkInWebView(String url) {
        //Llama al fragment webview y le agrega el parametro args
        WebviewFragment webViewFragment = new WebviewFragment();
        Bundle args = new Bundle();
        args.putString("url", url);
        webViewFragment.setArguments(args);
        
        //Abre el Fragment WebView
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.fragment_view, webViewFragment, "webview")
                .addToBackStack(null)
                .commit();
    }

Si usas navegación u otro método para cargar tus fragmentos, puedes crear un método aparte que abra el WebView Fragment y llamarlo dentro del código anterior, reemplazando la parte correspondiente.

Ya con esto, lo único que queda es enlazar el método openLinkInWebView(), con los botones que quieras, en cada fragment que lo quieras usar. Cómo la idea es pasarle varias URL al WebView Fragment desde otro Fragment (Home por ejemplo), lo mejor es crear un método privado para dicho fragment, que invoque el método que está en el MainActivity. Para eso hay varias formas, pero yo prefiero la siguiente:


private void openLinks(String url) {
        MainActivity mainActivity = (MainActivity)getActivity();
        assert mainActivity != null;
        mainActivity.openLinkInWebView(url);

    }

Luego sólo tendrás que agregar a cada botón el método recién creado y, dentro del paréntesis, con comillas anexar la URL que quieres que se abra en el WebView Fragment. Por ejemplo:


boton.setOnClickListener(v -> openLinks("https://www.sitesirvedealgo.com/ "))

El código anterior es sólo una forma de agregar un evento clic a tu botón, tú puedes hacerlo, según tu preferencia, sólo usé la forma más simple. Esto lo podrás replicar con tantos botones como desees, cambiado en cada uno la URL a la que apunta. También es posible crear variables para cada enlace y llamar dichas variables dentro del método, pero eso haría innecesariamente más largo el código y menos claro.

Aunque nunca he probado esto en Kotlin, lo lógico es que funcione de forme similar, adaptando el código a dicho lenguaje.

Siguiente Anterior
No hay comentarios aún
Agregar comentario
comment url