3

WebView にコンテンツを表示する Android アプリに取り組んでいます。コンテンツにはリンクが含まれており、これらのリンクはカスタム WebViewClient を介して処理され、javascript と shouldOverrideUrlLoading() メソッドを使用して、リンクの内容に応じてリンクをたどります。

問題は次のとおりです。

WebView のどこでクリックが発生したかによって、異なるクリックを処理したいと考えています。特に、ユーザーが WebView をクリックするたびに UI を変更したいのですが、リンクをクリックしません。

shouldOverrideUrlLoading() メソッドが呼び出される前に、onTouch メソッドが完了して終了する (super.onTouch を含む) ことがわかりました。私も GestureDetector を使用していますが、これも onSingleTapUp() メソッドが完了してから shouldOverrideUrlLoading() コードが実行されます。

イベントを終了する前に shouldOverrideUrlLoading() コードが実行されたかどうかに関係なく、WebView でクリックが発生したときに通知する方法が必要です。

誰がどこを見るかについてのヒントはありますか?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

アクティビティにコールバックする HTML の最も外側の要素に JavaScript onclick コードを追加できます。

アクティビティには次のものが必要です。

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 に答える