3

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

这是问题所在:

我想根据点击发生在 WebView 上的位置来处理不同的点击。特别是,我想在用户单击 WebView 时进行一些 UI 更改,但不单击链接。

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

必须有某种方法来注意 WebView 上发生单击时是否应该在完成事件之前运行 shouldOverrideUrlLoading() 代码。

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

谢谢,戴尔。

4

3 回答 3

4

我认为你应该能够使用 onTouch(),在你那里你可以检查它是否是一个被点击的链接:

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

如果它是一个 url,那么从你的 onTouch() 返回 false 以便它被传递给 shouldOverrideUrlLoading(); 如果它不是一个 url,那么对它做任何你想做的事情并返回 true,这样系统就知道你消费了这个事件。

于 2011-05-13T15:49:00.660 回答
3

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

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);
        }
}
于 2011-05-15T16:40:58.890 回答
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()" );
}
于 2011-07-28T23:01:51.240 回答