【问题标题】:Add a Progress Bar in WebView在 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_width="fill_parent"
    android:layout_height="fill_parent">

    <WebView  xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/webview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

    <TextView  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/hello" />
</LinearLayout>

【问题讨论】:

标签: android android-webview progressdialog android-progressbar


【解决方案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_width="wrap_content"
        android:layout_height="wrap_content" />
    

    希望这会有所帮助..

    【讨论】:

      【解决方案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(参见上面的答案stackoverflow.com/a/57068625/826946)对我来说效果更好
      【解决方案6】:

      将进度条和webview放在一个relativelayout中,并设置进度条的属性如下,

      1. 使其可见性消失。
      2. 在相对布局中居中。

      然后在 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

          谢谢:)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-10
            相关资源
            最近更新 更多