Обработка WebView onTouch, когда пользователь НЕ нажимает на ссылку - PullRequest
2 голосов
/ 13 мая 2011

Я работаю над приложением для Android, которое отображает контент в WebView.Содержимое содержит ссылки, и эти ссылки обрабатываются через пользовательский WebViewClient и используют javascript и метод shouldOverrideUrlLoading () для перехода по ссылке в зависимости от того, что это за ссылка.

Вот проблема:

Я хочу обрабатывать клики по-разному в зависимости от того, где в WebView происходит щелчок.В частности, я хочу вносить некоторые изменения в пользовательский интерфейс каждый раз, когда пользователь нажимает на WebView, но НЕ нажимает на ссылку.

Я обнаружил, что метод onTouch завершается и завершается (включая super.onTouch)до вызова метода shouldOverrideUrlLoading (), и я не могу найти никаких указаний на метод, который выполняется в WebView post-shouldOverrideUrlLoading ().Я также использую GestureDetector, и, опять же, метод onSingleTapUp () завершается до того, как будет запущен код shouldOverrideUrlLoading ().

Должен быть какой-то способ заметить, когда в WebView происходит щелчок, был ли запущен код shouldOverrideUrlLoading () перед завершением события.

У всех есть какие-либо советы о том, где искать?Кто-нибудь знает точку выполнения, которая вызывается в WebView после выполнения кода shouldOverrideUrlLoading ()?

Спасибо, Дейл.

Ответы [ 3 ]

2 голосов
/ 15 мая 2011

Для тех, кто сражается в одном и том же бою, вот пример кода, который решил эту проблему для меня.

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 голосов
/ 13 мая 2011

Я думаю, что вы должны быть в состоянии использовать onTouch (), внутри вашего там вы можете проверить, была ли ссылка нажата с помощью:

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

Если это был URL, товернуть false из вашего onTouch (), чтобы он передавался в shouldOverrideUrlLoading ();Если это не был URL, то делайте с ним все, что хотите, и возвращайте true, чтобы система знала, что вы использовали событие.

1 голос
/ 29 июля 2011

Вы можете добавить код 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()" );
}
...