Search code examples
androidandroid-webview

onPageFinished is firing before page is loaded


I just want to know when html page is loaded. OnPageFinished is called before whole page is loaded. I got blank view when I set Image View by bitmap created from WebView

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



        }); 

EDIT :

I tried to implement JavaScriptInterface for now only with making Toast message, but it still doesn't work. I've pasted html code and Java :

EDIT :

I finally got it working. I used JavaScriptInterface with proper . When loadUrl is launch html file is being loaded. When whole page is available on screen, onload function from html file call captureImage function from JavaScriptInterface class. Now I have sure that page is fully loaded and I can grab picture of it. Thanks for all help.

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>

Solution

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