当用户不单击链接时,WebView onTouch处理

时间:2011-05-13 15:17:10

标签: android url webview webviewclient

我正在开发一款在WebView中显示内容的Android应用。内容包含链接,这些链接通过自定义WebViewClient处理,并使用javascript和shouldOverrideUrlLoading()方法来跟踪链接,具体取决于链接。

问题在于:

我想处理不同的点击次数,具体取决于点击发生在WebView上的位置。特别是,我想在用户点击WebView时进行一些UI更改,但不要点击链接。

我发现onTouch方法在调用shouldOverrideUrlLoading()方法之前完成并完成(包括super.onTouch),我找不到任何在WebView post-shouldOverrideUrlLoading()上运行的方法的指示。我也在使用GestureDetector,再次,在触发了shouldOverrideUrlLoading()代码之前,它的onSingleTapUp()方法完成了。

在完成事件之前,无论是否运行了shouldOverrideUrlLoading()代码,都必须注意WebView上发生单击的时间。

任何人都有关于在哪里看的提示? 任何人都知道在执行了shouldOverrideUrlLoading()代码之后在WebView上调用的执行点?

谢谢, 戴尔。

3 个答案:

答案 0 :(得分:2)

我认为您应该可以使用onTouch(),在那里你可以查看它是否是使用点击的链接:

HitTestResult result = wv.getHitTestResult();
url = result.getExtra();

如果是url,则从onTouch()返回false,以便将其传递给shouldOverrideUrlLoading();如果它不是一个url然后用它做任何你想做的事情并返回true,那么系统知道你消耗了这个事件。

答案 1 :(得分:2)

对于那些打同一场战斗的人来说,这是为我解决这个问题的示例代码。

private GestureDetector.SimpleOnGestureListener _simpleOnGestureListener = new GestureDetector.SimpleOnGestureListener()
{    
        /* ... */

        @Override
        public boolean onSingleTapUp(MotionEvent e)
        {
            HitTestResult htResult = getHitTestResult();
            if (htResult != null && htResult.getExtra() != null)
            {
                // The click was on a link! Return true so to bypass processing.
                return true;
            }

            /**
             * 
             * Do your stuff
             * 
             */

            return super.onSingleTapUp(e);
        }
}

答案 2 :(得分:1)

您可以将javascript onclick代码添加到回调到您活动的html的最外层元素。

在您的活动中,您需要:

private void initializeClickableWebView( WebView webView, String innerHtml ) {
    webView.getSettings().setJavaScriptEnabled(true);
    webView.addJavascriptInterface(this, "jsBridge");

    String html = "<html><body><div onclick=\"window.jsBridge.processClick();\">" +
        innerHtml +
        "</div></body></html>";

    webView.loadDataWithBaseURL("file:///android_asset/", html,
            "text/html", "utf-8", null);
}

private void processClick() {
    Log.d( "webView", "processClick()" );
}