简体   繁体   English

如何在Android中加载URL时显示进度条?

[英]How to display a progress bar when WebView loads a URL, in Android ?

I am new in android apps development and learning it. 我是Android应用程序开发和学习它的新手。

I have developed an application which loads a website link using a WebView . 我开发了一个使用WebView加载网站链接的应用程序。 And it's working fine. 它工作正常。

But I am facing problems to display and hide progress bar when the WebView loads a page. 但是当WebView加载页面时,我在显示和隐藏进度条时遇到问题。

I want to display a progress bar (Just spinner in center) when the WebView loads the main link and internal links of a website and hide progress bar when page is completely loaded. 当WebView加载网站的主链接和内部链接并在页面完全加载时隐藏进度条时,我想显示一个进度条(中心只是微调器)。

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

And my layout XML code: 我的布局XML代码:

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

Right now, the progress bar is displayed, but it does not hide. 现在,显示进度条,但它不会隐藏。

When I create progressbar object and add below line in Java code then the progress bar is not displayed. 当我创建progressbar对象并在Java代码中添加以下行时,不会显示进度条。

progressbar.setVisibility(View.GONE);

I have also tried an other answer but the progress bar does not work when I click on internal links. 我还尝试了另一个答案但是当我点击内部链接时,进度条不起作用。

  1. I want to display progress bar when main page load and hide progress bar when the main page is completely loaded. 我想在主页加载时显示进度条,并在主页完全加载时隐藏进度条。

  2. I want to display the progress bar again when the user clicks on internal links of the website and same as above, hide the progress bar when the page is completely loaded. 我想在用户点击网站的内部链接时再次显示进度条,如上所述,在页面完全加载时隐藏进度条。

Please help, I am beginner in Android apps development. 请帮助,我是Android应用程序开发的初学者。

try this code... you need webChoromeClient to track the webview load progress... 尝试此代码...您需要webChoromeClient来跟踪webview加载进度...

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

    }
 }
});

Replace your webview client with this code.... 用此代码替换您的webview客户端....

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

Guaranteed Solution: 保证解决方案:

        webView.setWebViewClient(new WebViewClient() {

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

In case anyone is looking for a Kotlin solution, this simple one worked for me: 如果有人在寻找Kotlin解决方案,这个简单的解决方案对我有用

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

Hey guys, I have useful this method, That would surely help you too. 嘿伙计们,我有用这种方法,这肯定会帮助你。

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

I've added following to my code and it worked very well for me. 我在代码中添加了以下内容,它对我来说非常有用。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM