如何在Android WebView中获取完整的高度?

13
我有一个包含WebViewRelativeLayout。我正在将一些生成的HTML文本加载到该WebView中。加载数据后,WebView的高度超出屏幕。现在我需要整个WebView的高度。到目前为止,我尝试了WebView#getHeight()WebView#getBottom(),但我只得到可见内容的高度。
如何获取WebView的总高度? screen height

1
你必须使用JavaScript来完成这个任务。 - njzk2
1
你能告诉我怎么做吗? - shobhan
7个回答

17

最后我得到了我的问题的答案。这就是答案。

在加载WebView之后,我们将在WebViewClient#onPageFinished中被调用,然后我们需要调用javascript来获取WebView完整内容的高度。

WebViewClient

/**
 * Custom web client to perform operations on WebView
 */
class WebClient extends WebViewClient {

    @Override
    public void onPageFinished(WebView view, String url) {
            view.loadUrl("javascript:AndroidFunction.resize(document.body.scrollHeight)");
        }
    }
}

之后,我们将在 WebInterface 类中收到一个回调,其中该类已注册为 JavascriptInterface 并提供了高度信息。

/**
 * WebView interface to communicate with Javascript
 */
public class WebAppInterface {

    @JavascriptInterface
    public void resize(final float height) {
        float webViewHeight = (height * getResources().getDisplayMetrics().density);
        //webViewHeight is the actual height of the WebView in pixels as per device screen density
    }
}

如果需要在屏幕像素上获得实际高度,则调整大小非常重要。非常感谢。 - Boris Gafurov
嘿,readWebView是什么?啊- WebAppInterface的一个实例? - pale bone
不,这是webView实例。已编辑的答案。谢谢,我忘记这是我的回答了。;) - shobhan
1
由于 WebViewClient.onPageFinished() 只在页面加载完成后调用,因此当内容大小在加载后发生更改时(例如,在页面完成加载后呈现的 Javascript 内容、可展开和可折叠部分的用户交互)该解决方案就会不足。 - trod
在这种情况下,当内容被展开/折叠时,我们可以从网页中再次调用一个JavaScript。 - shobhan
显示剩余3条评论

5

将您的WebView放在ScrollView中,然后webView.getHeight()将返回实际WebView内容的高度。请确保您的WebView的高度属性设置为wrap_content

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <WebView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </WebView>
</ScrollView>

我也尝试了这种情况,但如果我们加载10张高质量的图片,它会出现内存错误。还有一件事,将WebView放在ScrollView中是不推荐的。 - shobhan
@shobhan 你可能会遇到OOM(Out of Memory)的问题,因为图像的分辨率比设备处理能力高得多。如果一个高分辨率图像大小为50MB,那么加载10个就需要250MB,再加上应用程序、操作系统等运行在内存小于1GB的设备上,你的应用程序很快就会被杀死。 - Trevor Hart
我想你试图解释我上面的评论的一部分。(OOM内存不足错误):P 谢谢。 - shobhan
如果您在使用ScrollView时遇到嵌套的ScrollView,请尝试在ScrollView内设置android:nestedScrollingEnabled="true"。 - Aleksandr A
永远不要将WebView包装在ScrollView内,这会使WebView扩展到最大尺寸,并且webView会认为所有内容都已显示。 WebView应该处理内容可见性,而不是ScrollView。 - Torhan Bartel

2
public class CustomWebView extends WebView{
    public CustomWebView(Context context) {
        super(context);
    }
    int ContentHeight = 0;
    public int getContentHeight(){
        if(ContentHeight==0)
            ContentHeight = computeVerticalScrollRange();
        return ContentHeight;
    }
}

Webview拥有一个受保护的方法computeVerticalScrollRange()。您可以通过创建自定义方法来访问此方法。

((CustomWebView) webView).getContentHeight())

“compute”这个词通常表示正在进行一些工作,可能是繁重的。 - njzk2
我使用这个解决方案时遇到了ClassCastException异常。有什么解决方法吗? - Ivan
没事了,我已经解决了。请看下面的完整答案。 - Ivan

1

kotlin: myWebView.contentHeight


在我的情况下,我还需要将myWebView.contentHeight乘以Resources.getSystem().displayMetrics.density来获取实际高度。 - user1795683

0

我的答案:

我认为您需要从layout.xml文件中移除padding属性。

即,从您的XML文件中移除以下内容并尝试。

android:paddingBottom    
android:paddingLeft    
android:paddingRight    
android:paddingTop

希望能够帮助到你!

-1
在你的Java类中添加getWindow()函数。
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_webview);
}

-1
private int getScale(){
    Display display = ((WindowManager) 
    getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
    int width = display.getWidth(); 
    Double val = new Double(width)/new Double(PIC_WIDTH);
    val = val * 100d;
    return val.intValue();
}

请查看此 链接以获取更多信息。


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