在 WebView 中添加进度条

     2023-04-15     90

关键词:

【中文标题】在 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。

谢谢:)

【讨论】:

android中webview怎么实现网页加载时显示加载进度

方法一:可以在WebView上面放一个进度条,加载webView时显示出来,然后webView里面有加载回调的方法,判断状态码如果是200则隐藏即可。方法二:在webview里面加进度条参考技术A可以在第一次加载进度达到百分之百时重新加载里一... 查看详情

Swift 中的进度条 WebView

】Swift中的进度条WebView【英文标题】:ProgressbarWebViewinSwift【发布时间】:2015-01-2608:59:56【问题描述】:我正在用xcode快速编写一个webapp。我有一个问题“如何添加一个进度条来显示每个页面的加载情况?”@IBOutletvarwebView:UIWebView!... 查看详情

Android:如何在将数据加载到 WebView 时显示进度条?

】Android:如何在将数据加载到WebView时显示进度条?【英文标题】:Android:HowcanishowprogressbarwhileloadingdataintoWebView?【发布时间】:2012-03-1115:00:40【问题描述】:如何在将数据加载到我的webview时显示进度条?我的代码:publicvoidonCreat... 查看详情

如何在 shell 脚本中添加进度条?

】如何在shell脚本中添加进度条?【英文标题】:Howtoaddaprogressbartoashellscript?【发布时间】:2010-09-1906:43:00【问题描述】:在bash或*NIX中的任何其他shell中编写脚本时,在运行需要几秒钟以上的命令时,需要一个进度条。例如,复... 查看详情

如何在 fusedlocationproviderclient.oncompletelistener() 中添加进度条?

】如何在fusedlocationproviderclient.oncompletelistener()中添加进度条?【英文标题】:Howtoaddprogressbarinfusedlocationproviderclient.oncompletelistener()?【发布时间】:2020-07-2013:06:06【问题描述】:我正在使用fusedlocationproviderclient来查找当前位置,... 查看详情

如何使用 tqdm 在 python 中添加进度条

】如何使用tqdm在python中添加进度条【英文标题】:howtoaddprogressbarinpythonusingtqdm【发布时间】:2020-06-2420:44:05【问题描述】:我有一个列出文件和目录并复制所需的脚本。现在我需要添加一个进度条来显示使用tqdm包的复制进度问... 查看详情

android进度条怎么显示百分比

显示百分比需要自己计算加载的内容,以下以webView示例,webView加载网页的时候可以增加进度条:1.从webView中获取设置WebSettingssws=webView.getSettings();sws.setSupportZoom(true);sws.setBuiltInZoomControls(true);webView.setInitialScale(25);webView.getSettings().... 查看详情

如何在 Alamofire 4.0 中添加带有上传进度百分比的标签的进度条

】如何在Alamofire4.0中添加带有上传进度百分比的标签的进度条【英文标题】:HowIcanaddprogressbarwithlabelwithpercentageofprogressofuploadinAlamofire4.0【发布时间】:2016-12-3112:01:18【问题描述】:我正在尝试通过Alamofire4.0将视频上传到服务器... 查看详情

进度条和 webview 问题

】进度条和webview问题【英文标题】:Progressbarandwebviewissue【发布时间】:2019-02-2202:42:11【问题描述】:当我用LinearLayout替换RelativeLayout时,我的webview会占据整个屏幕,包括工具栏,但是progressbar工作正常AND当我使用LinearLayout我的... 查看详情

android中webview怎么实现网页加载时显示加载进度?

android中只需要给webView注册一个事件即可实现加载进度。以下是具体实现代码:1.从webView中获取设置 WebSettingssws=webView.getSettings(); sws.setSupportZoom(true); sws.setBuiltInZoomControls(true); webView.setInitialScale(25); webView.getSettings().setUseWideViewP... 查看详情

easyui在table单元格中添加进度条

functionXR_jd(alue,rowData,rowIndex){varvalue;......varhtmlstr=‘<divclass="easyui-progressbarprogressbar"style="width:100%;height:20px;"value="‘+value+‘"text="‘+value+‘%">‘+‘<divclass="progre 查看详情

Android WebView 进度条

】AndroidWebView进度条【英文标题】:AndroidWebViewprogressbar【发布时间】:2011-02-0200:10:23【问题描述】:我看过一个类似于here的问题,但由于我是新手,有人可以解释一下如何让它在WebView中工作,或者至少如何设置10秒的时间延迟... 查看详情

显示下载进度条

...应用程序中,我使用执行器服务从url下载文件。现在我想添加一个水平进度条来显示下载进度。但我面临错误。如何在不使用异步任务的情况下在此代码中添加进度条?privateclassExecutorServiceDownloadimplementsRunnableprivateStringurl;p 查看详情

如何停止 Android webView swipeToRefresh 加载进度条?

】如何停止AndroidwebViewswipeToRefresh加载进度条?【英文标题】:HowtoStopAndroidwebViewswipeToRefreshloadingprogressbar?【发布时间】:2018-01-0115:41:10【问题描述】:注意:这个问题已经被问过here.,但没有得到任何答案,所以我决定用我的代... 查看详情

如何在 Android 中向 ViewPager 添加进度条

】如何在Android中向ViewPager添加进度条【英文标题】:HowtoAddprogressbartoViewPagerinAndroid【发布时间】:2012-04-1721:50:24【问题描述】:如何在Android中为ViewPager添加进度条?我的情况是我必须在ViewPager中加载imageURL。当用户滑动页面时... 查看详情

将加载指示器/进度条添加到 Phonegap Android 闪屏

...d项目,它可以很好地显示res/drawable/splash.png,一旦加载了WebView 查看详情

利用devexpress的gridcontrol添加进度条

第一步:在一个窗体中添加一个GridControl控件,如图所示: 第二步:点击控件中的RunDesigner,找到Columns,然后再选择要设置进度条的列,设置属性如下:第三步:点击View,找到事件CustomDrawCell,写如下的代码:privatevoidgridView1_Custom... 查看详情

delphi中如何实现如图所示的进度条效果

...单“File/NewApplication”创建一个新的工程。  2.在窗体中添加一个状态栏组件StatusBar1,一个Button组件Button1.在状态栏编辑器中为状态栏添加两个显示面板,因为后面将要在第二个面板中显示进度条,所以将第二个面板的Style属性... 查看详情