需要帮助获取内容视图高度 - Android

时间:2014-08-12 06:46:16

标签: java android

我需要一些帮助来获取我的自定义webView 内容高度,请检查下面是我的代码

    webView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            final int displayHeight = webView.getHeight();
            final int contentRange = webView.getContentHeight();
            final int y = v.getScrollY();


            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:

                    Log.d("Get webView height ", "" + displayHeight); // Result : 528
                    Log.d("Get webView content height ", "" + contentRange); // Result : 2112
                    Log.d("Get webView content scroll top ", "" + y);

                    return false;

                case MotionEvent.ACTION_CANCEL:
                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_MOVE:

            }

            return false;
        };

以上是我使用webview.setOnTouchListener获取自定义webView内容高度的代码,该代码正常工作。

但是,现在我想从按钮点击获取我的自定义WebView内容高度,这不起作用,我得到的是总是得到我的webView的高度而不是内容高度,在我的代码下方按钮点击

Button btn = (Button) this.getActivity().findViewById(R.id.btnCLick);

    btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            int webViewContentHeight = webView.getContentHeight();

            Log.d("Get my custom webView content height", " " + webViewContentHeight); // Result : 528

        }
    });

非常感谢,如果我能有详细的程序,谢谢。

3 个答案:

答案 0 :(得分:1)

我在渲染后找到获取contentHeight的最佳方式:

在布局中创建自己的类扩展WebView和此类:

public class BKWebView extends WebView {

private Activity yourActivity;

public BKWebView(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
}

public BKWebView(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
}

public BKWebView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    // TODO Auto-generated constructor stub
}

@Override
public void invalidate() {
    super.invalidate();

    if (getContentHeight() > 0) {
        // WebView has displayed some content and is scrollable.

        if (yourActivity != null)
            yourActivity.callBackWebView(getContentHeight());

    }
}

/**
 * @param yourActivity the yourActivity to set
 */
public void setYourActivity(Activity yourActivity) {
    this.yourActivity = yourActivity;
}   

}

在你的活动中实现回调方法然后在你的监听器中:

private webViewContentHeight;
BKWebView wv;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    wv = (BKWebView) findViewById(R.id.yourwebview);
    wv.setYourActivity(this);
    ...
}

public void callBackWebView(int contentHeight) {
    webViewContentHeight = contentHeight;
}


...
Button btn = (Button) this.getActivity().findViewById(R.id.btnCLick);
btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Log.d("Get my custom webView content height", " " + webViewContentHeight); 
    }
});
...

答案 1 :(得分:0)

很抱歉以前误解了你的问题。您可以在活动中设置“视图”和“按钮”全局,并在onCreate处对其进行实例化。为该按钮单独onClickEvent,而不是OnCreate,您可以在其中调用可能有效的全局WebView.getContentHeight()

在第一种情况下,您可以通过向WebView发送点击事件来使事情正常进行。更脏的解决方案。

WebView.performClick();

答案 2 :(得分:0)

你可以使用javascript

String js = "javascript:function initialize() { "
            + "var d = document.getElementsByTagName('body')[0];"
            + "var visibleH = window.innerHeight; " 
            + "var fullH = d.offsetHeight; "
            + "jsInterface.jsGetContentHeight(visibleH ,fullH); " 
            + "}";  
wv.loadUrl(js);
wv.loadUrl("javascript:initialize()");  

然后为webview定义JavaScriptInterface以检索值

wv.getSettings().setJavaScriptEnabled(true);
wv.addJavascriptInterface(new JavaScriptInterface(context),
            "jsInterface"); 
public class JavaScriptInterface {
    Context mContext;

    /** Instantiate the interface and set the context */
    JavaScriptInterface(Context c) {
        mContext = c;
    }

    @JavascriptInterface
    public void jsGetContentHeight(int visibleH,int fullH) {
        Toast.makeText(mContext, visibleH +"-"+ fullH, Toast.LENGTH_LONG).show();
    }
}