在 WebView 中添加进度条
Posted
技术标签:
【中文标题】在 WebView 中添加进度条【英文标题】:Add a Progress Bar in WebView 【发布时间】:2011-05-18 21:09:47 【问题描述】:我正在尝试向使用WebView
的应用程序添加进度/加载栏。我对如何实现每次单击链接时出现的进度条感到困惑。
当前代码:
public class CULearnBrowser extends Activity
WebView webview;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
webview = (WebView) findViewById(R.id.webview);
webview.setWebViewClient(new HelloWebViewClient());
webview.getSettings().setjavascriptEnabled(true);
webview.loadUrl("https://culearn.colorado.edu/webct/entryPageIns.dowebct");
private class HelloWebViewClient extends WebViewClient
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
view.loadUrl(url);
return true;
public boolean onKeyDown(int keyCode, KeyEvent event)
if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack())
webview.goBack();
return true;
return super.onKeyDown(keyCode, event);
活动布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_
android:layout_>
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webview"
android:layout_
android:layout_ />
<TextView
android:layout_
android:layout_
android:text="@string/hello" />
</LinearLayout>
【问题讨论】:
您正在寻找的答案在这里非常详细:giantflyingsaucer.com/blog/?p=1331 Android WebView progress bar的可能重复 如何从 WebView 点击按钮下载 pdf 或 doc 【参考方案1】:我在您的代码中添加了几行代码,现在它在进度条上运行良好。
getWindow().requestFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.main );
// Makes Progress bar Visible
getWindow().setFeatureInt( Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON);
webview = (WebView) findViewById(R.id.webview);
webview.setWebChromeClient(new WebChromeClient()
public void onProgressChanged(WebView view, int progress)
//Make the bar disappear after URL is loaded, and changes string to Loading...
setTitle("Loading...");
setProgress(progress * 100); //Make the bar disappear after URL is loaded
// Return the app name after finish loading
if(progress == 100)
setTitle(R.string.app_name);
);
webview.setWebViewClient(new HelloWebViewClient());
webview.getSettings().setJavaScriptEnabled(true);
webview.loadUrl("http://www.google.com");
【讨论】:
我见过类似的东西,但我不知道如何用我的代码来做 没有看到你的整个代码,是无法理解的。 我附上了 xml 这是唯一的其他文件 最终活动活动=这个; final ProgressDialog progressDialog = new ProgressDialog(activity); progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progressDialog.setCancelable(false); browser.setWebChromeClient(new WebChromeClient() public void onProgressChanged(WebView view, int progress) progressDialog.show(); progressDialog.setProgress(0); activity.setProgress(progress * 1000); progressDialog.incrementProgressBy(progress); 如果(progress == 100 && progressDialog.isShowing()) progressDialog.dismiss(); );setProgress()
从 API 21 开始被弃用。怎么办?【参考方案2】:
在这个方法中传递你的网址
private void startWebView(String url)
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
webView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setUseWideViewPort(true);
webView.getSettings().setLoadWithOverviewMode(true);
progressDialog = new ProgressDialog(ContestActivity.this);
progressDialog.setMessage("Loading...");
progressDialog.show();
webView.setWebViewClient(new WebViewClient()
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
view.loadUrl(url);
return true;
@Override
public void onPageFinished(WebView view, String url)
if (progressDialog.isShowing())
progressDialog.dismiss();
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
Toast.makeText(ContestActivity.this, "Error:" + description, Toast.LENGTH_SHORT).show();
);
webView.loadUrl(url);
【讨论】:
【参考方案3】:在您设置 Webview 的 oncreate 方法中。
@Override
protected void onCreate(Bundle savedInstanceState)
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.web_view);
web_view = (WebView) findViewById(R.id.web_view);
pd = new ProgressDialog(SiteOpenInWebView.this);
pd.setMessage("Please wait Loading...");
pd.show();
web_view.setWebViewClient(new MyWebViewClient());
web_view.loadUrl("ur site name");
WebViewClient
private class MyWebViewClient extends WebViewClient
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
view.loadUrl(url);
if (!pd.isShowing())
pd.show();
return true;
@Override
public void onPageFinished(WebView view, String url)
System.out.println("on finish");
if (pd.isShowing())
pd.dismiss();
【讨论】:
我已经尝试了很多代码,但没有代码在进度条的 web 视图上运行。但是这段代码运行良好,感谢 Nitesh Khosla 与您的代码相同,没有更改进度条而不是progressdialog【参考方案4】:这是我正在使用的代码:
WebViewClient 内部:
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon)
super.onPageStarted(view, url, favicon);
findViewById(R.id.progress1).setVisibility(View.VISIBLE);
@Override
public void onPageFinished(WebView view, String url)
findViewById(R.id.progress1).setVisibility(View.GONE);
这是 XML:
<ProgressBar
android:id="@+id/progress1"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_
android:layout_ />
希望这会有所帮助..
【讨论】:
【参考方案5】:对我来说最好的方法是
webView.setWebViewClient(new WebViewClient()
@Override public void onPageStarted(WebView view, String url, Bitmap favicon)
super.onPageStarted(view, url, favicon);
mProgressBar.setVisibility(ProgressBar.VISIBLE);
webView.setVisibility(View.INVISIBLE);
@Override public void onPageCommitVisible(WebView view, String url)
super.onPageCommitVisible(view, url);
mProgressBar.setVisibility(ProgressBar.GONE);
webView.setVisibility(View.VISIBLE);
isWebViewLoadingFirstPage=false;
【讨论】:
这个boolean isWebViewLoadingFirstPage的目的是什么,在哪里初始化这个? onPageStarted 很晚 - 在我想要的大部分时间里,进度微调器都不会显示。 shouldOverrideUrlLoading(参见上面的答案***.com/a/57068625/826946)对我来说效果更好【参考方案6】:将进度条和webview放在一个relativelayout中,并设置进度条的属性如下,
-
使其可见性消失。
在相对布局中居中。
然后在 webclient 的 onPageStarted() 中使进度条可见,以便在您单击链接时显示进度条。在 onPageFinished() 中,将进度条的可见性设置为 GONE ,以便在页面完成加载后它会消失......这对于您的场景来说可以正常工作。希望这会有所帮助...
【讨论】:
【参考方案7】:我尝试在 onPageFinished() 方法上关闭进度,但效果不佳,渲染 webview 有时间延迟。
尝试使用 onPageCommitVisible() 更好:
val progressBar = ProgressDialog(context)
progressBar.setCancelable(false)
progressBar.show()
val url = "your url here"
web_container.settings.javaScriptEnabled = true
web_container.loadUrl(url)
web_container.webViewClient = object : WebViewClient()
override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean
view.loadUrl(url)
progressBar.show()
return true
override fun onPageFinished(view: WebView?, url: String?)
super.onPageFinished(view, url)
override fun onPageCommitVisible(view: WebView?, url: String?)
super.onPageCommitVisible(view, url)
progressBar.dismiss()
web_container.setOnKeyListener(View.OnKeyListener _, keyCode, event ->
if (keyCode == KEYCODE_BACK && event.action == MotionEvent.ACTION_UP
&& web_container.canGoBack())
web_container.goBack()
return@OnKeyListener true
return@OnKeyListener false
)
【讨论】:
【参考方案8】:您可以在您的活动中尝试此代码
private void startWebView(WebView webView,String url)
webView.setWebViewClient(new WebViewClient()
ProgressDialog progressDialog;
public boolean shouldOverrideUrlLoading(WebView view, String url)
view.loadUrl(url);
return false;
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon)
super.onPageStarted(view, url, favicon);
public void onLoadResource (WebView view, String url)
if (progressDialog == null)
progressDialog = new ProgressDialog(SponceredDetailsActivity.this);
progressDialog.setMessage("Loading...");
progressDialog.show();
public void onPageFinished(WebView view, String url)
try
if (progressDialog.isShowing())
progressDialog.dismiss();
progressDialog = null;
catch(Exception exception)
exception.printStackTrace();
);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl(url);
用这种方式调用这个方法:
startWebView(web_view,"Your Url");
有时如果 URL 死了,它会被重定向,并且会在 onPageFinished 方法之前到达 onLoadResource()。因此,进度条不会关闭。要解决此问题,请参阅my this Answer。
谢谢:)
【讨论】:
以上是关于在 WebView 中添加进度条的主要内容,如果未能解决你的问题,请参考以下文章