如何在Android中获取WebView的宽度和高度

11

我想确定WebView的宽度和高度。我已经尝试使用以下方法:

webView.getWidth();
webView.getHeight();

但是生成的日志始终显示它们为0。


1
你能发一下你的代码吗?请记住,由于布局尚未发生,因此您不能在OnCreate方法中获取视图的宽度和高度。 - Whaledawg
我将我的代码放在这里 height = mainWebView.getHeight(); System.err.println("显示总高度->" +mainWebView.getHeight()); System.err.println("测量高度->" +mainWebView.getMeasuredHeight()); - Zala Janaksinh
12个回答

6
这里有一个更加优雅的解决方案。
public void onCreate(Bundle savedInstanceState) {


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

        webView.addOnLayoutChangeListener(new OnLayoutChangeListener() {

            @Override
            public void onLayoutChange(View v, int left, int top, int right,int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
                 int w= webView.getWidth();
                 int h= webView.getHeight();


            }
        });



    }   

2

你可能在onCreate中太早地检查了大小。尝试使用以下代码:

webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView webView, String url) {
                super.onPageFinished(webView, url);
                Log.i(TAG, findViewById(R.id.my_component).getWidth(););
            }
        });

2

对于其他仍然存在困难的人。 使用以下方法获取您的 webview 的高度和宽度。

computeHorizontalScrollRange(); -> for width 
computeVerticalScrollRange(); -> for height

1
请注意,这些方法返回的值可能与getWidth()和getHeight()返回的值不同,因为它们返回整个可滚动的宽度/高度,而不是WebView在屏幕上实际的宽度/高度。 - aaronmarino
还要注意这些方法是受保护的,你可能会发现在自定义布局中使用它们有些困难。 - Android developer

2

onPageFinished 回调方法在使用 loadDataloadDataWithBaseURL 时无效。我在 Andromedev 上看到了另一种使用 JavaScript 的解决方案,但我不确定这是否是最佳选择。


1

在加载HTML后,您需要WebView内容的宽度和高度。

确实需要,但是没有getContentWidth方法(只有视口值),而且getContentHeight()不准确!

答案:子类化WebView:

/*
  Jon Goodwin
*/
package com.example.html2pdf;//your package

import android.content.Context;
import android.util.AttributeSet;
import android.webkit.WebView;

class CustomWebView extends WebView
{
    public int rawContentWidth   = 0;                         //unneeded
    public int rawContentHeight  = 0;                         //unneeded
    Context    mContext          = null;                      //unneeded

    public CustomWebView(Context context)                     //unused constructor
    {
        super(context);
        mContext = this.getContext();
    }   

    public CustomWebView(Context context, AttributeSet attrs) //inflate constructor
    {
        super(context,attrs);
        mContext = context;
    }

    public int getContentWidth()
    {
        int ret = super.computeHorizontalScrollRange();//working after load of page
        rawContentWidth = ret;
        return ret;
    }

    public int getContentHeight()
    {
        int ret = super.computeVerticalScrollRange(); //working after load of page
        rawContentHeight = ret;
        return ret;
    }
//=========
}//class
//=========

1
嗯——我查看了WevView源代码,发现它们在内部使用View#getWidth和View#getHeight。这是其中一个WebView的私有方法:
/*
 * Return the width of the view where the content of WebView should render
 * to.
 */
private int getViewWidth() {
    if (!isVerticalScrollBarEnabled() || mOverlayVerticalScrollbar) {
        return getWidth();
    } else {
        return getWidth() - getVerticalScrollbarWidth();
    }
}

正如评论中所指出的,您必须确保在分配活动布局后进行测量,例如:setContentView(R.layout.mylayout);


1
你正在过早地检查webview的大小。 你可以在以下方法中尝试:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
    // TODO Auto-generated method stub
    super.onWindowFocusChanged(hasFocus);
            webView.getWidth();
            webView.getHeight();
}

1

我使用了一个解决方法,不是从不可靠的webview获取数据,而是从DisplayMetrics获取数据,假设您的webview宽度几乎等于手机屏幕大小,高度几乎等于手机屏幕大小的高度。

DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int height = (int) displayMetrics.heightPixels*0.9;
int width = displayMetrics.widthPixels;

0

我希望我的回答能够帮助到某些人。

如果你想在内容加载后获取 webview 的高度,那么这可能会有所帮助。

ViewTreeObserver viewTreeObserver  = mWebView.getViewTreeObserver();
viewTreeObserver.addOnPreDrawListener(new OnPreDrawListener() {
 @Override
 public boolean onPreDraw() {                                
     int height = mWebView.getMeasuredHeight();
        if( height != 0 ){
      Toast.makeText(getActivity(),"height:"+height,Toast.LENGTH_SHORT).show();
                             mWebView.getViewTreeObserver().removeOnPreDrawListener(this);
                       }
                       return false;
               }
       });

0

我曾经有过同样的问题。我只是把initWebView方法放在onWindowFocusChangedt里。

public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    initWebView();
}


private void initWebView(){
    if(isOnline()){
        venueWebView = (WebView) findViewById(R.id.venueWebView);
        String url = "some url";
        int viewWight = venueWebView.getWidth();
        int viewHeight = venueWebView.getHeight();
        venueWebView.loadUrl(url);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接