【问题标题】:WebView onTouch handling when the user does NOT click a link用户未单击链接时的 WebView onTouch 处理
【发布时间】:2011-08-25 01:02:24
【问题描述】:

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

问题来了:

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

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

必须通过某种方式来通知 WebView 上发生点击时是否应该在完成事件之前运行 shouldOverrideUrlLoading() 代码。

有人对在哪里看有什么建议吗? 有人知道在 shouldOverrideUrlLoading() 代码执行后在 WebView 上调用的执行点吗?

谢谢, 戴尔。

【问题讨论】:

  • 您是否只想处理 web 视图中任何非链接的点击?或者您是否尝试获取点击特定非链接项目的事件?
  • 谢谢蒂姆。我想要以下逻辑:如果点击链接 { // 做某事 } else { // 做其他事情 }
  • 好的,你的链接是否按照你想要的方式正常工作,现在你只是想让非链接工作?
  • 没错,蒂姆。链接有自己的逻辑,但这在这里并不重要。我想要的是能够在这两件事为真时触发一些代码:1)在 webview 上发生触摸 2)该触摸没有导致 shouldOverrideUrlLoading() 调用(即,它不是链接)作为据我所知, shouldOverride.. 逻辑出现在 WebViews 本机 onTouch 处理之后,这导致了我的问题。

标签: android url webview webviewclient


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢蒂姆。这无疑是对正确道路的推动,并且现在正在发挥作用。 HitTestResult 似乎是确定点击是否带有 url 的好方法。
  • 只需添加您就可以在result.getType() == WebView.HitResultType.SRC_ANCHOR_TYPE 上进行测试以仅获得<a href="..."/> 的点击次数(请参阅here
【解决方案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);
        }
}

【讨论】:

    【解决方案3】:

    您可以将 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()" );
    }
    

    【讨论】:

      猜你喜欢
      • 2013-05-03
      • 2018-04-18
      • 1970-01-01
      • 2018-07-17
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      相关资源
      最近更新 更多