web-dev-qa-db-fra.com

Android Barre de progression de WebView

J'ai regardé une question similaire à celle-ci ici mais comme je suis un débutant, quelqu'un pourrait-il expliquer comment faire en sorte que cela fonctionne dans une WebView ou au moins comment définir un délai de 10 secondes pour que les gens sachent que ça charge?

66
Max Marroni

Pour une barre de progression horizontale, vous devez d’abord définir votre barre de progression et la lier comme suit avec votre fichier XML, dans le fichier onCreate:

final TextView txtview = (TextView)findViewById(R.id.tV1);
final ProgressBar pbar = (ProgressBar) findViewById(R.id.pB1);

Ensuite, vous pouvez utiliser la méthode onProgressChanged dans votre WebChromeClient:

MyView.setWebChromeClient(new WebChromeClient() {
            public void onProgressChanged(WebView view, int progress) {
               if(progress < 100 && pbar.getVisibility() == ProgressBar.GONE){
                   pbar.setVisibility(ProgressBar.VISIBLE);
                   txtview.setVisibility(View.VISIBLE);
               }

               pbar.setProgress(progress);
               if(progress == 100) {
                   pbar.setVisibility(ProgressBar.GONE);
                   txtview.setVisibility(View.GONE);
               }
            }
        });

Après cela, dans votre mise en page, vous avez quelque chose comme ça

<TextView Android:text="Loading, . . ." 
    Android:textAppearance="?android:attr/textAppearanceSmall"
    Android:id="@+id/tV1" Android:layout_height="wrap_content"
    Android:layout_width="wrap_content"
    Android:textColor="#000000"></TextView>

<ProgressBar Android:id="@+id/pB1"
    style="?android:attr/progressBarStyleHorizontal" Android:layout_width="fill_parent"
    Android:layout_height="wrap_content" Android:layout_centerVertical="true"
    Android:padding="2dip">
</ProgressBar>

Voici comment je l'ai fait dans mon application.

122
Yahyaotaif

Je viens de trouver un très bon exemple de la procédure à suivre ici: http://developer.Android.com/reference/Android/webkit/WebView.html . Il vous suffit de changer le setprogress de:

activity.setProgress(progress * 1000);

à

activity.setProgress(progress * 100);
21
Max Marroni

voici le moyen le plus simple d’ajouter une barre de progression dans Android Web View.

Ajouter un champ booléen dans votre activité/fragment

private boolean isRedirected;

Ce booléen empêchera la redirection des pages Web en raison de liens morts. Vous pouvez désormais passer votre objet WebView et votre URL Web à cette méthode.

private void startWebView(WebView webView,String url) {

    webView.setWebViewClient(new WebViewClient() {
        ProgressDialog progressDialog;

        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            isRedirected = true;
            return false;
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            isRedirected = false;
        }

        public void onLoadResource (WebView view, String url) {
            if (!isRedirected) {
                if (progressDialog == null) {
                    progressDialog = new ProgressDialog(SponceredDetailsActivity.this);
                    progressDialog.setMessage("Loading...");
                    progressDialog.show();
                }
            }

        }
        public void onPageFinished(WebView view, String url) {
            try{
                isRedirected=true;

                if (progressDialog.isShowing()) {
                    progressDialog.dismiss();
                    progressDialog = null;
                }



            }catch(Exception exception){
                exception.printStackTrace();
            }
        }

    });

    webView.getSettings().setJavaScriptEnabled(true);
    webView.loadUrl(url);
}

Ici, quand commencer le chargement, il appellera onPageStarted. Ici, le champ booléen est faux. Mais une fois le chargement de la page terminé, la méthode onPageFinished et le champ booléen sont définis sur true. Parfois, si l'URL est mort, il sera redirigé et il arrivera à la méthode onLoadResource() avant la méthode onPageFinished. Pour cette raison, la barre de progression ne sera pas masquée. Pour éviter cela, je vérifie if (!isRedirected) dans onLoadResource()

dans la méthode onPageFinished() avant de fermer la boîte de dialogue de progression, vous pouvez écrire votre code de délai de 10 secondes

C'est ça. Bonne codage :)

9
Md. Sajedul Karim

Selon Md. Sajedul Karim réponse, j'en ai écrit un similaire.

webView = (WebView) view.findViewById(R.id.web);
progressBar = (ProgressBar) view.findViewById(R.id.progress);
webView.setWebChromeClient(new WebChromeClient());

setProgressBarVisibility(View.VISIBLE);
webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
        setProgressBarVisibility(View.VISIBLE);
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        setProgressBarVisibility(View.GONE);
    }

    @Override
    public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
        super.onReceivedError(view, request, error);
        Toast.makeText(getActivity(), "Cannot load page", Toast.LENGTH_SHORT).show();
        setProgressBarVisibility(View.GONE);
    }
});

webView.loadUrl(url);

private void setProgressBarVisibility(int visibility) {
    // If a user returns back, a NPE may occur if WebView is still loading a page and then tries to hide a ProgressBar.
    if (progressBar != null) {
        progressBar.setVisibility(visibility);
    }
}
7
CoolMind

C'est vrai, il y a aussi une option plus complète, comme changer le nom de l'application pour une phrase que vous voulez. Consultez ce tutoriel, il peut aider:

http://www.firstdroid.com/2010/08/04/adding-progress-bar-on-webview-Android-tutorials/

Dans ce tutoriel, vous avez un exemple complet d'utilisation de la barre de progression dans une application de visualisation Web.

Adrian.

4
Adrian Zelezniak

C'est comme ça que je l'ai fait avec Kotlin pour montrer les progrès en pourcentage.

Ma mise en page de fragment.

<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
         xmlns:tools="http://schemas.Android.com/tools"
         Android:layout_width="match_parent"
         Android:layout_height="match_parent">

<WebView
    Android:id="@+id/webView"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"/>

<ProgressBar
    Android:layout_marginLeft="32dp"
    Android:layout_marginRight="32dp"
    style="?android:attr/progressBarStyleHorizontal"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:layout_gravity="center"
    Android:id="@+id/progressBar"/>
</FrameLayout>

Mon fragment de kotlin dans onViewCreated

    progressBar.max = 100;
    webView.webChromeClient = object : WebChromeClient() {
        override fun onProgressChanged(view: WebView?, newProgress: Int) {
            super.onProgressChanged(view, newProgress)
            progressBar.progress = newProgress;
        }
    }

    webView!!.webViewClient = object : WebViewClient() {

        override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
            progressBar.visibility = View.VISIBLE
            progressBar.progress = 0;
            super.onPageStarted(view, url, favicon)
        }

        override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
            view?.loadUrl(url)
            return true
        }

        override fun shouldOverrideUrlLoading(
            view: WebView?,
            request: WebResourceRequest?): Boolean {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
                view?.loadUrl(request?.url.toString())
            }
            return true
        }

        override fun onPageFinished(view: WebView?, url: String?) {
            super.onPageFinished(view, url)
            progressBar.visibility = View.GONE
        }
    }

    webView.loadUrl(url)
1
ninjahoahong