2014-04-15 6 views
6

Sto implementando una WebView in modo che possa ridimensionare l'altezza in base all'altezza del contenuto. Ho provato a fare quanto segue:WebView Android getContentHeight() restituisce sempre 0

WebView view = new WebView(context); 
view.loadData(htmlString, "text/html", "utf-8"); 

view.setWebViewClient(new WebViewClient() { 
    public void onPageFinished(WebView view, String url) { 
     super.onPageFinished(view, url); 
     Log.d("2", view.getContentheight() + ""); 
     // Set the height of the webview to view.getContentHeight() here? 
    } 
}); 

Log.d("1", view.getContentHeight() + ""); 

Dove htmlString è una stringa di formato HTML.

Tuttavia sia i due registri di restituire 0.

Non sono sicuro se sto facendo la cosa giusta. Come posso conoscere l'altezza del contenuto quindi impostare di conseguenza l'altezza del WebView?

risposta

1

è possibile ottenere l'altezza e la larghezza con javascript dalla visualizzazione Web.

WebView view = new WebView(context); 
view.loadData(htmlString, "text/html", "utf-8"); 
view.getSettings().setJavaScriptEnabled(true); 
view.setSaveEnabled(true); 
view.addJavascriptInterface(new JavaScriptInterface(), "HTMLOUT"); 
view.setWebViewClient(new WebViewClient() { 
@Override 
public void onPageFinished(WebView view, String url){ 
    view.loadUrl("javascript:window.HTMLOUT.getContentHeight 
     (document.getElementByTagName('html')") 
    } 
}); 
view.loadDataWithBaseURL(null,htmlString,"text/html","utf-8,null"); 

    } 



class JavascriptInterface{ 
    public void getContentHeight(String value){ 
     if (value != null){ 
      webviewContentHeight = Integer.parseInt(value); 
      Log.d(LOG_TAG("result from js"+webviewContentHeight); 
      Toast.makeText(activity,"Content Height is:"+webviewContentHeight, 
        Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 
+0

metodo get altezza non sempre chiamato !! – Tony

9

questo è perché il callback onPageFinished significa WebView ha finito di leggere il byte dalla rete, proprio questo. Nel momento in cui viene attivato il punto onPageFinished, la pagina potrebbe non essere ancora analizzata.

Se l'altezza del WebView è impostato su wrap_contents allora si potrebbe fare qualcosa di simile:

WebView v = new WebView() { 
    @Override 
    public void onSizeChanged(int w, int h, int ow, int oh) { 
     super.onSizeChanged(w, h, ow, oh); // don't forget this or things will break! 
     Log.d(TAG, "WebView height" + getContentHeight()); 
    } 
}; 

Se il WebView non è wrap_contents allora una possibilità è quella di fare ciò che josedlujan suggerito in his answer a questa domanda e prendere il altezza da JavaScript.

Un'altra opzione sarebbe quella di utilizzare il deprecato PictureListener:

webview.setPictureListener(new PictureListener() { 
    int previousHeight; 
    @Override 
    public void onNewPicture(WebView w, Picture p) { 
     int height = w.getContentHeight(); 
     if (previousHeight == height) return; 
     previousHeight = height; 
     Log.d(TAG, "WebView height" + height); 
    } 
}); 
-2

È possibile farlo, fornendo un certo ritardo in onPageFinished()

webView.setWebViewClient(new WebViewClient() { 
     @Override 
     public void onPageFinished(WebView view, String url) { 
      super.onPageFinished(view, url); 
      new Handler().postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        int contentHeight = webView.getContentHeight(); 
        int viewHeight = webView.getHeight(); 
        Toast.makeText(context, "*** " + contentHeight + " - " + viewHeight, Toast.LENGTH_SHORT).show(); 
       } 
      }, 500); 
     } 
    }); 
0

Ecco il codice lavorando per ottenere webview scrollheight on view caricamento terminato:

WebView webviewPageTest=new WebView(this); 
webviewPageTest.getSettings().setJavaScriptEnabled(true); 
class JsObject { 
    @JavascriptInterface 
     public void toString(String jsResult) { 
      Log.v("scrolH:",jsResult); 
      //use this if you need actual onscreen measurements 
      //float webViewHeight = (Integer.parseInt(jsResult) * getResources().getDisplayMetrics().density); 
     } 
    } 

webviewPageTest.addJavascriptInterface(new JsObject(), "HTMLOUT"); 
webviewPageTest.setWebViewClient(new WebViewClient() { 
    public void onPageFinished(WebView view, String url) { 
     view.loadUrl("javascript:(function() { var h = document.body.scrollHeight; window.HTMLOUT.toString(h); })()"); 
     } 
    }); 

this.addContentView(webviewPageTest, params); 

lavorato qui Łukasz Sromek e josedlujan sopra e qui android dev docs