Android WebView Fortschrittsbalken

69

Ich habe bei einer Frage ähnlich wie dies sehe hier aber als ich ein Neuling bin könnte jemand erklären , wie dies in einem WebView zur Arbeit kommen oder zumindest wie eine 10 Sekunden Zeitverzögerung einstellen , damit die Leute wissen , dass es den Laden?

Max Marroni
quelle
1
Dies ist ein fast genaues Duplikat von stackoverflow.com/questions/2496119/… . Schauen Sie dort nach, ob das hilft. Wenn dies nicht der Fall ist, bearbeiten Sie Ihre Frage, um Details darüber anzugeben, was genau Sie nicht schaffen, um zur Arbeit zu kommen.
Steve Haley
1
Sie haben den vollständigen Code, um eine Fortschrittsladeleiste über den Link zur Website der Android-Entwickler verfügbar zu machen. Haben Sie sogar versucht, ihr Beispiel zu verwenden? Sobald Sie haben, sollten Sie in der Lage sein, es an Ihre Bedürfnisse anzupassen.
Steve Haley
Wie mache ich dasselbe in einem Fragment? Ich folge den gleichen Schritten, aber der Fortschrittsbalken ist nicht sichtbar.
Prakhar Mohan Srivastava

Antworten:

140

Für einen horizontalen Fortschrittsbalken müssen Sie zuerst Ihren Fortschrittsbalken definieren und ihn wie folgt mit Ihrer XML-Datei verknüpfen onCreate:

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

Anschließend können Sie die onProgressChanged-Methode in Ihrem WebChromeClient verwenden:

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);
               }
            }
        });

Danach haben Sie in Ihrem Layout so etwas

<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>

So habe ich es in meiner App gemacht.

Yahyaotaif
quelle
3
Dies sollte als die beste Antwort markiert werden, da es in Bezug auf veralteten Code in den Codefragmenten der WebView-Dokumente ( developer.android.com/reference/android/webkit/WebView.html ) auf dem
neuesten Stand ist
21

Ich habe gerade ein wirklich gutes Beispiel dafür gefunden: http://developer.android.com/reference/android/webkit/WebView.html . Sie müssen nur den Setprogress ändern von:

activity.setProgress(progress * 1000);

zu

activity.setProgress(progress * 100);
Max Marroni
quelle
Was tun bei einem Fragment?
Prakhar Mohan Srivastava
SetProgress () der Aktivität ist jetzt veraltet.
DaveNOTDavid
10

Hier ist der einfachste Weg, um Fortschrittsbalken in Android Web View hinzuzufügen.

Fügen Sie Ihrer Aktivität / Ihrem Fragment ein boolesches Feld hinzu

private boolean isRedirected;

Dieser Boolesche Wert verhindert die Umleitung von Webseiten aufgrund toter Links. Jetzt können Sie einfach Ihr WebView-Objekt und Ihre Web-URL an diese Methode übergeben.

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);
}

Hier wird beim Start des Ladevorgangs aufgerufen onPageStarted. Hier setze ich Boolesches Feld ist falsch. Aber wenn das Laden der Seite beendet ist, kommt es zur onPageFinishedMethode und hier wird das Boolesche Feld auf true gesetzt. Manchmal, wenn die URL tot ist, wird sie umgeleitet und kommt onLoadResource()vor der onPageFinishedMethode. Aus diesem Grund wird der Fortschrittsbalken nicht ausgeblendet. Um dies zu verhindern, checke ich if (!isRedirected)einonLoadResource()

In der onPageFinished()Methode können Sie vor dem Schließen des Fortschrittsdialogs Ihren 10-Sekunden-Zeitverzögerungscode schreiben

Das ist es. Viel Spaß beim Codieren :)

Md. Sajedul Karim
quelle
1
Vielen Dank. Ich habe gelöscht shouldOverrideUrlLoadingund onLoadResourceeinen Fortschrittsstart verschoben onPageStarted. Außerdem wurde onReceivedErrordort eine Fortschritts- und Toastnachricht hinzugefügt und geschrieben.
CoolMind
10

Laut der Antwort von Md. Sajedul Karim habe ich eine ähnliche geschrieben.

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);
    }
}
CoolMind
quelle
3

So habe ich es mit Kotlin gemacht, um Fortschritte in Prozent zu zeigen.

Mein Fragmentlayout.

<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>

Mein Kotlin-Fragment in 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)
Ninjahoahong
quelle
-2

Warten Sie, bis der Vorgang abgeschlossen ist ...

while(webview.getProgress()< 100){}
progressBar.setVisibility(View.GONE);
Idan
quelle