Android WebView 进度条
Posted
技术标签:
【中文标题】Android WebView 进度条【英文标题】:Android WebView progress bar 【发布时间】:2011-02-02 00:10:23 【问题描述】:我看过一个类似于 here 的问题,但由于我是新手,有人可以解释一下如何让它在 WebView 中工作,或者至少如何设置 10 秒的时间延迟,以便人们知道它正在加载?
【问题讨论】:
这是***.com/questions/2496119/… 的几乎完全相同的副本。去那边看看有没有帮助。如果没有,请编辑您的问题,详细说明您无法开始工作的具体内容。 您已获得完整代码,可在指向 android 开发者网站的链接中使用进度加载栏。你甚至尝试过使用他们的例子吗?一旦你有了,你应该能够适应你的需要。 如何在片段中做同样的事情?我正在执行相同的步骤,但进度条不可见。 【参考方案1】:对于水平进度条,您首先需要定义进度条并将其与您的 XML 文件链接,如下所示,在 onCreate
:
final TextView txtview = (TextView)findViewById(R.id.tV1);
final ProgressBar pbar = (ProgressBar) findViewById(R.id.pB1);
然后,您可以在 WebChromeClient 中使用 onProgressChanged 方法:
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);
);
在那之后,在你的布局中你有这样的东西
<TextView android:text="Loading, . . ."
android:textAppearance="?android:attr/textAppearanceSmall"
android:id="@+id/tV1" android:layout_
android:layout_
android:textColor="#000000"></TextView>
<ProgressBar android:id="@+id/pB1"
style="?android:attr/progressBarStyleHorizontal" android:layout_
android:layout_ android:layout_centerVertical="true"
android:padding="2dip">
</ProgressBar>
这就是我在我的应用中的做法。
【讨论】:
这应该被标记为最佳答案,因为它在 WebView 文档 (developer.android.com/reference/android/webkit/WebView.html) 的代码 sn-ps 中已弃用的代码方面是最新的【参考方案2】:我刚刚在这里找到了一个非常好的示例: http://developer.android.com/reference/android/webkit/WebView.html 。 您只需将 setprogress 更改为:
activity.setProgress(progress * 1000);
到
activity.setProgress(progress * 100);
【讨论】:
出现片段怎么办?【参考方案3】:这是在 android Web 视图中添加进度条的最简单方法。
在你的活动/片段中添加一个布尔字段
private boolean isRedirected;
这个布尔值将防止网页重定向导致死链接。现在你可以将你的 WebView 对象和 web Url 传递给这个方法。
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);
这里开始加载时会调用onPageStarted
。这里我设置布尔字段为假。但是当页面加载完成时,它将来到onPageFinished
方法,这里的布尔字段设置为true。有时,如果 url 死了,它会被重定向,它会在 onPageFinished
方法之前到达 onLoadResource()
。因此,它不会隐藏进度条。为了防止这种情况,我在onLoadResource()
中检查if (!isRedirected)
在 onPageFinished()
方法中,在关闭进度对话框之前,您可以编写 10 秒延时代码
就是这样。快乐编码:)
【讨论】:
谢谢。我删除了shouldOverrideUrlLoading
和onLoadResource
,将进度开始移至onPageStarted
。还添加了onReceivedError
并在那里写了一个进度结束和祝酒消息。【参考方案4】:
根据 Md. Sajedul Karim 回答我写了一个类似的。
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);
【讨论】:
【参考方案5】:确实,还有更完整的选项,比如为你想要的句子更改应用程序的名称。检查本教程它可以提供帮助:
http://www.firstdroid.com/2010/08/04/adding-progress-bar-on-webview-android-tutorials/
在该教程中,您有一个完整的示例如何在 webview 应用程序中使用进度条。
阿德里安。
【讨论】:
【参考方案6】:这就是我使用 Kotlin 的方式,以百分比显示进度。
我的片段布局。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_>
<WebView
android:id="@+id/webView"
android:layout_
android:layout_/>
<ProgressBar
android:layout_marginLeft="32dp"
android:layout_marginRight="32dp"
style="?android:attr/progressBarStyleHorizontal"
android:layout_
android:layout_
android:layout_gravity="center"
android:id="@+id/progressBar"/>
</FrameLayout>
我在 onViewCreated 中的 kotlin 片段
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)
【讨论】:
【参考方案7】:您可能正在寻找大多数浏览器使用的进度条...
我的 XML:
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout
android:id="@+id/progressLayout"
android:layout_
android:layout_
android:background="#3F51B5"
android:orientation="horizontal">
<ProgressBar
android:id="@+id/progressbar"
android:layout_
android:layout_
android:background="#3F51B5"
android:indeterminate="false"
style="?android:progressBarStyleHorizontal" />
</LinearLayout>
<WebView
android:id="@+id/webview"
android:layout_
android:layout_ />
</LinearLayout>
onCreate 内部:
webview.loadUrl("https://www.google.com");
核心:
webview.setWebViewClient(new WebViewClient()
@Override
public void onPageStarted(WebView _param1, String _param2, Bitmap _param3)
everyTime = new TimerTask()
@Override
public void run()
runOnUiThread(new Runnable()
@Override
public void run()
progressbar.setProgress(webview.getProgress());
);
;
_timer.scheduleAtFixedRate(everyTime, (int)(1), (int)(1));
//This code below is optional
progressbar.setVisibility(View.VISIBLE);
//
super.onPageStarted(_param1, _param2, _param3);
@Override
public void onPageFinished(WebView _param1, String _param2)
progressLayout.setVisibility(View.INVISIBLE);
everyTime.cancel();
super.onPageFinished(_param1, _param2);
);
如果你用 ChromeClient 替换 WebViewClient 没问题 ;)
输出:
【讨论】:
【参考方案8】:等到进程结束...
while(webview.getProgress()< 100)
progressBar.setVisibility(View.GONE);
【讨论】:
以上是关于Android WebView 进度条的主要内容,如果未能解决你的问题,请参考以下文章
Android:如何在将数据加载到 WebView 时显示进度条?