【问题标题】:Android progressbar inside WebViewWebView中的Android进度条
【发布时间】:2013-10-25 08:08:36
【问题描述】:

为了创建一个 webView,我最近使用了 webViewClient。 mWebView.setWebViewClient(new WebViewClient());

但我需要实现一个进度条。当用户单击链接时,此进度条将可见。页面完成后,进度条将被隐藏,webView 将可见。关于this 和this,所以我添加了一个WebChromeClient。但是它会加载第一个 URL,但是当我单击网页内的按钮时,会打开一个对话框并询问使用哪个应用程序打开 URL。

我读到我应该重写shouldOverrideUrlLoading() 方法。但我收到一个错误,“shouldOverrideUrlLoading”不能被 WebChromeClient 覆盖。

如果你能举一个有进度条和 webView 的例子,我会很高兴,同时在同一个 webView 中打开新的 URL。

public class WebActivity extends Activity {
    WebView mWebView;
    ProgressBar mProgress;
    Context mContext;
    ProgressBar mProgressBar;

   @Override
   public void onCreate(Bundle savedInstanceState) {
      this.mContext = getApplicationContext();

      super.onCreate(savedInstanceState);
      setContentView(R.layout.web);

      mWebView = (WebView) findViewById(R.id.webview);

      mWebView.setWebChromeClient(new myWebChromeClient());
      mWebView.getSettings().setJavaScriptEnabled(true);
      mWebView.getSettings().setUserAgentString("myApp");

      mProgressBar = (ProgressBar) findViewById(R.id.webProgressBar);
      mProgressBar.setMax(100);
  }

  public class myWebChromeClient extends WebChromeClient {
      @Override
      public boolean shouldOverrideUrlLoading(WebView view, String url) {
          view.loadUrl(url);
          return false;
      }
      @Override
      public void onProgressChanged(WebView view, int newProgress) {
          //WebActivity.this.setValue(newProgress);
          super.onProgressChanged(view, newProgress);
      }
  }
}

【问题讨论】:

    标签: android webview


    【解决方案1】:
      try with this code 
      webView = (WebView) view.findViewById(R.id.transcationwebview);
                progressdialog = ProgressDialog.show(mContext, "",
                        mContext.getString(R.string.please_wait));
                progressdialog.setCancelable(true);
                progressdialog.setOnCancelListener(new OnCancelListener() {
    
                    @Override
                    public void onCancel(DialogInterface dialog) {
                        webView.stopLoading();
                        // webView.clearView();
    
                    }
                });
    
                webView.getSettings().setJavaScriptEnabled(true);
                webView.setWebChromeClient(new MyChromeClient());
                webView.setWebViewClient(new WebViewClient() {
                    @Override
                    public boolean shouldOverrideUrlLoading(WebView view, String url) {
                        // TODO Auto-generated method stub
                        view.loadUrl(url);
                        return super.shouldOverrideUrlLoading(view, url);
                    }
    
                    @Override
                    public void onPageFinished(WebView view, String url) {
                        // TODO Auto-generated method stub
                        super.onPageFinished(view, url);
                        if (progressdialog != null && progressdialog.isShowing()) {
                            progressdialog.dismiss();
                        } else {
    
    
                        }
    
                    }
    
                    @Override
                    public void onPageStarted(WebView view, String url, Bitmap favicon) {
                        // TODO Auto-generated method stub
                        super.onPageStarted(view, url, favicon);
                    }
    
                    @Override
                    public void onReceivedError(WebView view, int errorCode,
                            String description, String failingUrl) {
                        // TODO Auto-generated method stub
    
                        super.onReceivedError(view, errorCode, description, failingUrl);
    
                    }
                });
    
                webView.loadUrl("url");
                webView.getSettings().setBuiltInZoomControls(true);
    
    
    
    public class MyChromeClient extends WebChromeClient {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                try {
    
                    if (progressdialog.isShowing()) {
                        progressdialog.setMessage(getString(R.string.loading)
                                + newProgress + " %");
    
                    } else {
                        /*
                         * webView.stopLoading(); webView.clearView();
                         */
                    }
                } catch (Throwable e) {
    
                    e.printStackTrace();
                }
            }
        }
    

    【讨论】:

    • 扩展 WebChromeClient 和 WebViewClient 是个好主意。所以我可以同时显示进度百分比并在PageFinished 上隐藏进度条。谢谢。
    【解决方案2】:

    您可以extends WebViewClient 代替WebChromeClient 并覆盖onPageStarted 以显示ProgressBar 并在onPageReceived 中将其关闭

    【讨论】:

      【解决方案3】:

      我在 Activity 中做了一些更改。

      使用 WebViewClient 而不是 WebChromeClient

      并且还使用 ProgressDialog 而不是 ProgressBar

      public class WebActivity extends Activity {
          WebView mWebView;
          Context mContext;
          ProgressDialog mProgressBar;
          private static final int DIALOG2_KEY = 1;
      
         @Override
         public void onCreate(Bundle savedInstanceState) {
            this.mContext = getApplicationContext();
            super.onCreate(savedInstanceState);
            setContentView(R.layout.web);
            mWebView = (WebView) findViewById(R.id.webview);
            mWebView.setWebViewClient(new MyWebChromeClient());
            mWebView.getSettings().setBuiltInZoomControls(true);
            showDialog(DIALOG2_KEY);  }
      
          @Override
              protected void onResume() {
                  super.onResume();
                  mWebView.loadUrl("YOUR_URL");
                    }
      
         private final class MyWebChromeClient extends WebViewClient {
              @Override
              public void onPageFinished(WebView view, String url) {
                  dismissDialog(DIALOG2_KEY);
              }
      
              @Override
              public boolean shouldOverrideUrlLoading(WebView view, String url) {
                  if (url.startsWith("file")) {
                      return false;
                  } else{
                      view.loadUrl(url);
                      return true;
                  }
              }
          }
      
         @Override
          protected Dialog onCreateDialog(int id) {
              switch (id)
              {
              case DIALOG2_KEY:
              {
                  mProgressBar.setMessage("Loading");
                  mProgressBar.setIndeterminate(true);
                  mProgressBar.setCancelable(false);
                  return mProgressBar;
              }
              }
              return null;
          }
      }
      

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 2019-03-26
        • 2011-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多