web-dev-qa-db-fra.com

Comment afficher une barre de progression lorsque WebView charge une URL, sous Android

Je suis nouveau dans le développement d'applications Android et je l'apprends.

J'ai développé une application qui charge un lien vers un site Web à l'aide de WebView. Et ça fonctionne bien.

Mais je suis confronté à des problèmes pour afficher et masquer la barre de progression lorsque WebView charge une page.

Je souhaite afficher une barre de progression (juste spinner au centre) lorsque WebView charge le lien principal et les liens internes d'un site Web et masque la barre de progression lorsque la page est complètement chargée.

Mon code Java:

package in.matebook.myapplication;

import Android.app.Activity;
import Android.content.Intent;
import Android.net.Uri;
import Android.os.Bundle;
import Android.view.Menu;
import Android.view.MenuItem;
import Android.webkit.WebSettings;
import Android.webkit.WebView;
import Android.webkit.WebViewClient;


public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        WebView myWebView = (WebView) findViewById(R.id.webView);
        myWebView.setWebViewClient(new MyWebViewClient());
        WebSettings webSettings = myWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        myWebView.loadUrl("http://www.labnol.org");
    }



    private class MyWebViewClient extends WebViewClient {

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {

            if (Uri.parse(url).getHost().equals("www.labnol.org")) {
                // This is my web site, so do not override; let my WebView load the page
                //or we can add more allowed Host in if condition
                return false;
            }
            // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            startActivity(intent);
            return true;
        }


    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return false;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

Et mon code XML de mise en page:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    tools:context=".MainActivity">


    <WebView  xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:id="@+id/webView"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        />

    <ProgressBar
        Android:id="@+id/progressBar"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        style="?android:attr/progressBarStyleLarge"
        Android:layout_centerVertical="true"
        Android:layout_centerHorizontal="true" />

</RelativeLayout>

Pour le moment, la barre de progression est affichée, mais elle ne se cache pas.

Lorsque je crée un objet progressbar et que j'ajoute une ligne au-dessous de code Java, la barre de progression ne s'affiche pas.

progressbar.setVisibility(View.GONE);

J'ai également essayé une autre réponse mais la barre de progression ne fonctionne pas lorsque je clique sur des liens internes.

  1. Je souhaite afficher la barre de progression lors du chargement de la page principale et masquer la barre de progression lorsque la page principale est complètement chargée.

  2. Je souhaite afficher à nouveau la barre de progression lorsque l'utilisateur clique sur des liens internes du site Web et comme précédemment, masque la barre de progression lorsque la page est complètement chargée.

S'il vous plaît, aidez-moi, je suis débutant dans le développement d'applications Android.

9
Rinku

essayez ce code ... vous avez besoin de webChoromeClient pour suivre la progression du chargement de la visualisation Web ...

webView.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {
    progressBar.setProgress(progress);
    if (progress == 100) {
        progressBar.setVisibility(View.GONE);

    } else {
        progressBar.setVisibility(View.VISIBLE);

    }
 }
});

Remplacez votre client WebView par ce code ....

private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    view.loadUrl(url);
    return true;
   }
}
25
Rishad Appat

Solution garantie:

        webView.setWebViewClient(new WebViewClient() {

        @Override
        public void onPageCommitVisible(WebView view, String url) {
            super.onPageCommitVisible(view, url);
            mProgressBar.setVisibility(View.INVISIBLE);
        }
    });
3
Ronit Mankad

Au cas où quelqu'un chercherait une Kotlin solution, cette solution simple a fonctionné pour moi:

private fun setupWebView() {

    val webViewClient: WebViewClient = object: WebViewClient() {

        override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
            view?.loadUrl(request?.url.toString())
            return super.shouldOverrideUrlLoading(view, request)
        }

        override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
            showProgressDialog()
            super.onPageStarted(view, url, favicon)
        }

        override fun onPageFinished(view: WebView?, url: String?) {
            hideProgressDialog()
            super.onPageFinished(view, url)
        }
    }
    webView.webViewClient = webViewClient

    webView.settings.javaScriptEnabled = true
    webView.settings.defaultTextEncodingName = "utf-8"
}
2
Marcelo Gracietti

Salut les gars, j'ai utile cette méthode, cela vous aiderait sûrement aussi.

XML

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

<ProgressBar
    Android:id="@+id/progress_bar"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_centerHorizontal="true"
    Android:layout_centerVertical="true" />

Java:

WebView webView = (WebView)findViewById(R.id.webid);
WebSettings websettings = webView.getSettings();

webSettings.setJavaScriptEnabled(true);
webSettings.setGeolocationEnabled(true);
webSettings.setSupportMultipleWindows(true);


webView.setWebViewClient(new WebViewClient(){

    public void onPageFinished(WebView view,String url){
       ProgressBar progressbar = (ProgressBar) findViewById(R.id.progress_bar);
       progressbar.setVisibility(View.GONE);
       }
});
0
Mac Dilshad

J'ai ajouté la suite à mon code et cela a très bien fonctionné pour moi.

XML:  

   <WebView
    Android:id="@+id/updates_webview"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"  />

   <ProgressBar
    Android:id="@+id/progressBar"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    style="?android:attr/progressBarStyleLarge"
    Android:layout_centerVertical="true"
    Android:layout_centerHorizontal="true" />

Java:

public class HelloWebViewClient extends WebViewClient {
    @Override
    public void onPageFinished(WebView view, String url) {
        // TODO Auto-generated method stub
        super.onPageFinished(view, url);
        ProgressBar progressBar =  findViewById(R.id.progressBar1);
        progressBar.setVisibility(View.GONE);
    }
}
0
Harshil Shah