【问题标题】:how to show progress bar on webview?如何在 webview 上显示进度条?
【发布时间】:2010-10-11 06:26:39
【问题描述】:

我正在尝试使用WebView 在我的应用程序中打开一个网页。当我打开网页时,它会显示一段时间的空白屏幕,然后在我的应用程序内的浏览器中打开该页面。

有人建议我如何显示进度或摆脱加载 webview 期间出现的空白屏幕吗?

我正在使用以下代码:

WebView mWebView = (WebView) findViewById(R.id.mywebview);
mWebView.getSettings().setJavaScriptEnabled(true);

// error handling
final Activity activity = this;

mWebView.setWebViewClient(new WebViewClient() {
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
        Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show();
    }
});

// error  handling

mWebView.loadUrl(URL);
mWebView.setWebViewClient(new HelloWebViewClient());

【问题讨论】:

标签: android


【解决方案1】:

试试这个:

getWindow().requestFeature(Window.FEATURE_PROGRESS);

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

mWebView.getSettings().setJavaScriptEnabled(true);

final Activity activity = this;

mWebView.setWebChromeClient(new WebChromeClient(){

         public void onProgressChanged(WebView view, int progress) {
                 activity.setTitle("Loading...");
                 activity.setProgress(progress * 100);
                    if(progress == 100)
                       activity.setTitle("My title");
                 }
});

mWebView.loadUrl(URL);

【讨论】:

  • 当我点击通过 chrome 应用程序打开的 url 时。但我想用线条进度条在我的网页视图中打开它。
  • Window.FEATURE_PROGRESS 已弃用
  • Activity 的 setProgress() 也被弃用了。
  • activity.setProgress(仅进度。NOT * 100);
【解决方案2】:

这是我正在使用的代码:

WebViewClient 内部:

webView.setWebViewClient(new 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) {
        super.onPageFinished(view, 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" />

希望这会有所帮助..

【讨论】:

    【解决方案3】:

    你需要做这样的事情:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_PROGRESS);
        this.setProgressBarVisibility(true);
    }
    

    然后

    final Activity activity = this;
    mWebView.setWebChromeClient(new WebChromeClient() {
        public void onProgressChanged(WebView view, int progress) {
            activity.setProgress(progress * 100);
        }
    });
    

    更新
    我知道这有点太晚了,但我有一点旁注:你不应该使用setWebViewClient() 两次。第二次调用会取消第一次调用,因此您不会得到错误处理。

    【讨论】:

      【解决方案4】:

      1.在 oncreate 你的 call AsyncTask

      2.在 asynctask 中,您只需制作进度对话框并显示进度对话框。

      3.在 webview 客户端中,您只需再次显示进度对话框,单击在您的 webview 中打开的网站的任何链接,完成加载链接后,我们 覆盖方法 onPageFinished 并在此方法中我们关闭进度对话框。

      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);
      
          OpenWebSiteInWebView opensite = new OpenWebSiteInWebView();
          opensite.execute();
      
      }
      

      异步任务

      private class OpenWebSiteInWebView extends AsyncTask<String, Void, String> {
      
          @SuppressWarnings("deprecation")
          @SuppressLint("SetJavaScriptEnabled")
          @Override
          protected String doInBackground(String... params) {
              web_view.setWebViewClient(new MyWebViewClient());
              web_view.loadUrl("ur site name");
              return null;
          }
      
          @Override
          protected void onPostExecute(String result) {
      
          }
      
          @Override
          protected void onPreExecute() {
      
              pd = new ProgressDialog(SiteOpenInWebView.this);
              pd.setMessage("Please wait Loading...");
              pd.show();
      
          }
      
      }
      

      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();
              }
      
          }
      }
      

      【讨论】:

        【解决方案5】:

        这是我在 KOTLIN 中使用的代码:

        private fun setupWebView() {
        
            val webViewClient: WebViewClient = object: WebViewClient() {
        
                override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
                    view?.loadUrl(request?.url.toString())
                    return super.shouldOverrideUrlLoading(view, request)
                }
        
                override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
                    showProgressDialog()
                    super.onPageStarted(view, url, favicon)
                }
        
                override fun onPageFinished(view: WebView?, url: String?) {
                    hideProgressDialog()
                    super.onPageFinished(view, url)
                }
            }
            webView.webViewClient = webViewClient
        
            webView.settings.javaScriptEnabled = true
            webView.settings.defaultTextEncodingName = "utf-8"
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多