2014-07-07 111 views
6

我只想知道何時加載了html頁面。 OnPageFinished在整個頁面加載之前調用。我有空白視圖,當我從的WebViewonPageFinished在頁面加載之前觸發

創建位圖中設置圖像查看
 mWebView.getSettings().setJavaScriptEnabled(true); 
     mWebView.setAlwaysDrawnWithCacheEnabled(true); 


    mWebView.setWebViewClient(new WebViewClient(){ 


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

       super.onPageStarted(view, url, favicon); 

      } 



      @Override 
      public void onPageFinished(WebView view,String url){ 

        Bitmap b = Bitmap.createBitmap(480, 240, Bitmap.Config.ARGB_8888);  
        Canvas c = new Canvas(b); 
        view.layout(view.getLeft(), view.getTop(), view.getRight(), view.getBottom()); 
        view.draw(c); 
        mImageView.setImageBitmap(b); 


       //b.recycle(); 
      } 



     }); 

編輯:

我試圖執行JavaScriptInterface現在只能做吐司消息,但它仍然無法正常工作。我已經粘貼HTML代碼和Java:

編輯:

我終於得到它的工作。我用正確的JavaScriptInterface。當loadUrl啓動時正在加載html文件。當整個頁面在屏幕上可用時,來自html文件的onload函數從JavaScriptInterface類調用captureImage函數。現在我確定該頁面已經完全加載,我可以抓取它的圖片。感謝所有幫助。

CODE:

JAVA:

mWebView.getSettings().setJavaScriptEnabled(true); 
    mWebView.setDrawingCacheEnabled(true); 
    mWebView.addJavascriptInterface(new JavaScriptInterface(this), "Android"); 
    mWebView.setWebViewClient(new WebViewClient(){}); 
    mButton.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 


      mWebView.loadUrl("file:///android_asset/html_sample.html"); 
      //mWebView.loadUrl("https://www.onet.pl"); 

     } 
    }); 

public class JavaScriptInterface { 
    private Context mContext;; 

    public JavaScriptInterface(Context context) { 
     mContext = context; 
    } 

    @JavascriptInterface 
    public void captureImage(){ 

     Bitmap b = mWebView.getDrawingCache(true); 
     mImageView.setImageBitmap(b); 
    } 

    @JavascriptInterface 
    public void showToast(String toast) { 
     Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); 
    } 
} 

HTML:

<html> 
<head> 
    <title>My first styled page</title> 
    <link rel="stylesheet" href="sample_css.css"> 

</head> 

<body onload="function(){ Android.captureImage() }"> 
... 
</body> 
</html> 
+0

您可以詳細說明您嘗試執行的操作嗎?你的目標是什麼API級別? HTML是否包含iframe?等等。開始〜對WebView的API-12內部改變開始打破像WebView.PictureListener ... –

回答

0
try this :- 


OnClickListener btnGoListener = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     webView00.loadUrl(etUrl.getText().toString()); 
     webView00.setWebViewClient(new WebViewClient() { 

      public void onPageFinished(WebView view, String url) { 
       Toast.makeText(getBaseContext(), "Loading Finished 2", Toast.LENGTH_LONG) 
       .show(); 
      } 
     }); 
    } 
}; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.activity_web_page00); 

    webView00 = (WebView) findViewById(R.id.webView00); 
    btnGo = (Button) findViewById(R.id.go_btn); 
    etUrl = (EditText) findViewById(R.id.url_edittext); 

    webView00.getSettings().setJavaScriptEnabled(true); 

    btnGo.setOnClickListener(btnGoListener); 
    webView00.loadUrl("http://google.com"); 

    //webView00.setWebViewClient(new myWebViewClient()); 
    //webView00.setWebChromeClient(new myWebChromeClient()); 
    webView00.setWebViewClient(new WebViewClient() { 

     public void onPageFinished(WebView view, String url) { 
      Toast.makeText(getBaseContext(), "Loading Finished 1", Toast.LENGTH_LONG) 
      .show(); 
     } 
    }); 
} 
0

使用WebViewClient並如下onPageFinished方法:

mWebView.setWebViewClient(new WebViewClient() { 
@Override 
public boolean shouldOverrideUrlLoading(WebView view, String urlNewString) { 
    if (!loadingFinished) { 
     redirect = true; 
    } 

loadingFinished = false; 
webView.loadUrl(urlNewString); 
return true; 
} 

@Override 
public void onPageStarted(WebView view, String url) { 
    loadingFinished = false; 
    //SHOW LOADING IF IT ISNT ALREADY VISIBLE 
} 

@Override 
public void onPageFinished(WebView view, String url) { 
    if(!redirect){ 
     loadingFinished = true; 
    } 

    if(loadingFinished && !redirect){ 
    Bitmap b = Bitmap.createBitmap(480, 240, Bitmap.Config.ARGB_8888);  
    Canvas c = new Canvas(b); 
    view.layout(view.getLeft(), view.getTop(), view.getRight(), view.getBottom()); 
    view.draw(c); 
    mImageView.setImageBitmap(b); 
    } else{ 
     redirect = false; 
    } 

} 
}); 

欲瞭解更多信息,請參閱https://stackoverflow.com/a/5172952/685240

希望它有幫助。

編輯:根據您的評論,我認爲您的網頁成功加載,但它需要時間呈現/繪製頁面在屏幕上,這是您的問題的原因。嘗試執行onPictureListener for webview。有關更多參考信息,請參閱https://stackoverflow.com/a/18123023/685240

+1

一切都正常當我加載網頁如「https://www.google.com」,但是當我想要加載存儲在資產中的靜態HTML文件,onFinishedPage在整個頁面加載之前觸發。有沒有方法調用該頁面加載?也許從HTML? – dzakens

+0

是否有可能使用html 通知所有內容已加載? – dzakens

+0

@dzakens檢查我編輯的答案。 –

5

這是因爲onPageFinished表示「頁面已完成加載」,而不是「頁面在屏幕上」。不幸的是,WebView沒有'你想要的頁面現在在屏幕上'API。人們通常會求助於PictureListener(由於它不可靠而不推薦使用)和隨機超時(超長或在某些設備上無法使用)的組合。

你可以嘗試渲染一個小的位圖並檢查每個PictureListener回調是否全白(並且記得在你完成等待時停止這樣做,否則如果頁面有動畫的話會燒掉大量的CPU/GIF動畫/等。)。如果頁面有大圖像,渲染到小位圖仍然會佔用大量CPU資源,所以這絕對不是一個好的解決方案。

0

它也發生在我身上,在WebViewClient中,onPageFinished的回調在實際的window.load事件之前發生。

仍在調查爲什麼會發生這種情況,這很難,因爲android應用程序是由高度定製的內部混合應用程序生成器生成的。

不過,我已經通過實施保護措施來檢查腳本中是否存在錯誤,我想在onPageFinished中調用,在這種情況下,我添加了一個事件處理函數,它在窗口期間再次調用我的腳本。加載。

您也可以使用document.addEventListener(「DOMContentLoaded」,...)而不是window.load。

下面是一個代碼片段,它也是debug.log調用的例子。您可以將該呼叫作爲參數傳遞給您的JavaScript界面​​

private void executeOnLoad(final WebView view, final String jsStringToExecute) { 
      StringBuilder sb = new StringBuilder("javascript:"); 
      sb.append("try {console.log('native.onPageFinished. document.readyState: ' + document.readyState);").append(jsStringToExecute).append("} catch(err){console.log('error calling jsBridge script on page load, deferring call to window.load event');") 
      .append("window.addEventListener('load', function() {console.log('window.onload callled from native. document.readyState: ' + document.readyState);").append(jsStringToExecute).append("});").append("}"); 
      String jsWithWindowLoadedFallback = sb.toString(); 
      view.loadUrl(jsWithWindowLoadedFallback); 
     } 
相關問題