17

Chrome や Firefox などの他のブラウザーと同様に、ユーザーがリンクを長押ししてからコンテキスト メニューを表示する必要がありますが、何かを長押ししてもリンクではない場合は何もしません。

を使用registerForContextMenu(myWebView);すると、不要なオブジェクトを長くクリックできます。registerForContextMenu(myWebView);したがって、オブジェクトをフィルタリングするか、リンクのhtmlを解析する必要があると思いますが、これはやり過ぎのようです。メソッドのオーバーライドも試しましたshouldOverrideUrlLoading

private boolean isLongClicked = false;  

this.webView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
                  if(isLongCLicked){
                          //do something
                     }else
                view.loadUrl(url);

            return true;
        }

    });

    webView.setOnLongClickListener(new OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                        isLongClicked = true;
                    forumView.performClick();
                        isLongCLicked = false;
                    return false;
                }
            });

このスレッドEnable longClick in WebViewを見ましたが、役に立ちませんでした。実装してみましたが、力が入ります。

import android.content.Context;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.webkit.WebView;

public class WebViewSub extends WebView {


    public WebViewSub(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    @Override
    protected void onCreateContextMenu(ContextMenu menu) {
        super.onCreateContextMenu(menu);

        HitTestResult result = getHitTestResult();

        MenuItem.OnMenuItemClickListener handler = new MenuItem.OnMenuItemClickListener() {
            public boolean onMenuItemClick(MenuItem item) {
                // do the menu action
                return true;
            }
        };

        if (result.getType() == HitTestResult.IMAGE_TYPE
                || result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
            // Menu options for an image.
            // set the header title to the image url
            menu.setHeaderTitle(result.getExtra());
            menu.add("save image")
                    .setOnMenuItemClickListener(handler);
            menu.add("View Image")
                    .setOnMenuItemClickListener(handler);
        } else if (result.getType() == HitTestResult.ANCHOR_TYPE
                || result.getType() == HitTestResult.SRC_ANCHOR_TYPE) {
            // Menu options for a hyperlink.
            // set the header title to the link url
            menu.setHeaderTitle(result.getExtra());
            menu.add("Save Link")
                    .setOnMenuItemClickListener(handler);
            menu.add("Share Link")
                    .setOnMenuItemClickListener(handler);
        }
    }
}

最後に、HitTestResult を使用してみました。これはおそらく、問題の解決に最も近いものです。

myWebView.setOnLongClickListener(new OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                registerForContextMenu(myWebView);
                WebView.HitTestResult result = forumView.getHitTestResult();
                if(result.getType() == 7){


                    openContextMenu(myWebView);

                }
                unregisterForContextMenu(myWebView);
                return false;
            }
        });

これはリンクに対してのみ機能しますが、コンテキスト メニューが空白の四角形として表示されます。実際の OnLongClick ビューを使用してみましたが、どちらも機能していないようです。コンテキスト メニューが間違っているとは思いません。OnLongClickの外で機能しました。

@Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        getMenuInflater().inflate(R.menu.click, menu);
    }

メニューを正しく表示するにはどうすればよいですか? HitTestResult onLongClick を使用して正しい軌道に乗っていると思います。

編集(回答):

myWebView.setOnLongClickListener(new OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                unregisterForContextMenu(myWebView);
                WebView.HitTestResult result = forumView.getHitTestResult();
                if(result.getType() == 7){
                registerForContextMenu(myWebView);


                }

                return false;
            }
        });

ロングクリックするたびに、コンテキストメニューの登録が解除されてから登録され、メニューがポップアップします。リンクがクリックされるとすぐに、登録されているコンテキスト メニューの登録が解除され、コンテキスト メニューをプルするためのリンクであるかどうかが判断されるため、これはうまくいくと思います。以前は、ユーザーがオプションを選択する時間がなく、コンテキスト メニューを登録した直後に登録解除していました。

4

1 に答える 1

1

これは実際、私が取り組んでいるアプリが原因で最近遭遇した状況です。あなたがたどり着いた解決策は、私が実装したものと本質的に同じです。

    webView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            unregisterForContextMenu(webView);
            WebView.HitTestResult result = webView.getHitTestResult();
            if (result.getType() == WebView.HitTestResult.SRC_ANCHOR_TYPE) {
                registerForContextMenu(webView);
            } else {
                return true;
            }

            return false;
        }

を使用すると、フィルタリングされた結果が WebView から取得されることに注意してください。result.getExtra()この場合はa HTML::a tag with src=http. true (処理済み) を返すことで、WebView の他の長いクリックも無視することに注意してください。

于 2016-08-02T13:14:05.270 に答える