【问题标题】:How to know if webView started rendering in android如何知道webView是否开始在android中渲染
【发布时间】:2017-03-09 16:10:38
【问题描述】:

我正在WebView 中加载 pdf。

WebView webView = new WebView(this);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setPluginState(WebSettings.PluginState.ON);
webView.setWebViewClient(new WebViewClient());

String url = "http://drive.google.com/viewerng/viewer?embedded=true&url=http://" + getIntent().getStringExtra("url");

webView.loadUrl(url);
setContentView(webView);

无论何时启动活动,WebView 都会显示为空白。但我想显示一个进度对话框,直到WebView 开始呈现 pdf 文件。如何向WebView 添加一个侦听器,指示文件已启动,对用户可见。

【问题讨论】:

  • 为什么要在网页视图中显示?使用PdfRenderererer 并只显示一个微调器,直到渲染位图。
  • 但是使用 PDfRenderer 我将不得不单独渲染每个页面,这可能是一项繁琐的任务。
  • 是的,但是在android中一切都很麻烦。

标签: android pdf webview android-webview


【解决方案1】:

您可以创建自定义类并使用WebViewClient 对其进行扩展。然后覆盖方法onPageStarted,您可以认为它开始渲染。例如:

private class CustomWebClient extends WebViewClient {

@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
      super.onPageStarted(view, url, favicon);

      showProgress();

   }
   @Override
   public void onPageFinished(WebView view, String url) {
       super.onPageFinished(view, url);
       dismissDialog();
   }

}

【讨论】:

  • 如果我禁用 onPageStarted() 中的进度对话框,它会显示 webview 仍然是空白和白色。我怎么知道webview已经开始渲染pdf文件了?
  • @R.Y :您必须使用 onPageStarted() 开始加载进度对话框。您将一直显示,直到您在 onPageFinished() 中收到通知。
【解决方案2】:

公共类 FGWebViewClient 扩展 WebViewClient {

private WebViewClient wvc;
private static final String TAG=FGWebViewClient.class.getCanonicalName();
ProgressDialog mProgressDialog;

 // when you add the webviewclient then show the progressDialog.
public FGWebViewClient(Context context) {
    Log.i(TAG, "FGWebViewClient Called...");

   this.wvc=wvc;
    mProgressDialog=new ProgressDialog(context);
    mProgressDialog.setMessage("URL Loading...");
    mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    mProgressDialog.setCanceledOnTouchOutside(false);


    if(mProgressDialog!=null){
        mProgressDialog.show();
    }



}

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.i(TAG,"shouldOverrideUrlLoading");
    return  wvc.shouldOverrideUrlLoading(view, url);
}

@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {

    Log.i(TAG,"onPageStarted");

    wvc.onPageStarted(view, url, favicon);
}
 // OnpageFinished just dismiss the progressDialog.
@Override
public void onPageFinished(WebView view, String url) {

    if(mProgressDialog!=null&&mProgressDialog.isShowing()){
         mProgressDialog.dismiss();
         mProgressDialog=null;
     }

    Log.i(TAG,"onPageFinished");
    //To clear cache of webview
    //view.clearCache(true);
    //clearEveryThing(view);

    wvc.onPageFinished(view,url);
}

然后这样调用

WebView webView=(WebView)v.findViewById(R.id.webView1);

        FGWebViewClient webViewClient=  new FGWebViewClient(context);
        webView.setWebViewClient(webViewClient);


        webView.setWebChromeClient(new WebChromeClient());
        webView.clearCache(true);
        webView.clearHistory();
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        webView.loadUrl((webUrl).toString());   

【讨论】:

    【解决方案3】:

    您可以使用 setWebViewClient 并显示 showProgress 如下代码

    WebSettings settings = webView.getSettings();
                settings.setJavaScriptEnabled(true);
                settings.setPluginState(WebSettings.PluginState.ON);
                webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
    
                showProgress();
                webView.setWebViewClient(new WebViewClient() {
                    public boolean shouldOverrideUrlLoading(WebView view, String url) {
                        view.loadUrl(url);
                        return true;
                    }
    
                    public void onPageFinished(WebView view, String url) {
                        hideProgress();
                    }
    
                    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                        hideProgress();
                    }
    
                });
    
    String url = "http://drive.google.com/viewerng/viewer?embedded=true&url=http://" + getIntent().getStringExtra("url");
    
    webView.loadUrl(url);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-14
      • 2013-06-20
      • 2020-04-04
      • 2012-02-07
      • 2016-12-14
      • 2017-10-05
      相关资源
      最近更新 更多