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

我是Android应用程序开发和学习的新手。

我开发了一个使用WebView加载网站链接的应用程序。 它工作正常。

但是当WebView加载页面时,我正面临着显示和隐藏进度条的问题。

当WebView加载网站的主链接和内部链接并在页面完全加载时隐藏进度条时,我想要显示一个进度条(只在中心旋转)。

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

和我的布局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> 

现在,进度条显示,但不隐藏。

当我创建进度条对象并在Java代码中添加下面的行时,不显示进度条。

 progressbar.setVisibility(View.GONE); 

我也尝试了其他答案,但进度条不起作用,当我点击内部链接。

  1. 我想在主页面加载时显示进度条,当主页面完全加载时隐藏进度条。

  2. 当用户点击网站的内部链接和上面的相同时,我想再次显示进度条,当页面完全加载时隐藏进度条。

请帮忙,我是Android应用程序开发的初学者。

试试这个代码…你需要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); } } }); 

用这个代码替换你的webview客户端….

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

保证解决方案

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

如果有人正在寻找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" } 

嘿家伙,我有这个方法有用,这也一定会帮助你。

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