java - Android Webview,仅在链接上启用设置长按?

标签 java android webview

与 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 View ,但它似乎也不起作用。我认为我的上下文菜单没有错;它在 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;
            }
        });

每次长按都会取消注册上下文菜单,然后再注册,弹出菜单。我相信这是可行的,因为一旦单击链接,它就会取消注册已注册的上下文菜单,然后决定它是否是拉出上下文菜单的链接。以前,它不会给用户时间来选择一个选项,并在注册上下文菜单后立即取消注册。

最佳答案

这实际上是我最近遇到的一种情况,因为我一直在开发一个应用程序——您得到的解决方案与我实现的解决方案基本相同,所以这里是为了完成:

    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;
        }

请注意,通过使用 result.getExtra(),您将从 WebView 检索过滤后的结果,在本例中,HTML::a 带有 src=http 的标记 . 请注意,我还通过返回 true(已处理)忽略 WebView 上的任何其他长按。

关于java - Android Webview,仅在链接上启用设置长按?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17126019/

相关文章:

java - switch 语句的default case 是否应该有一个break?

java - 为什么 Maven Ear 包使用项目的旧 jar 版本,尽管 war 子项目包含最新的 jar 版本?

java - 交叉引用和垃圾回收

Android 和 LibGDX : create XML file in local storage

webview - 更新到 OS 10 Swift 3 后,我收到以下 Web 过滤输出消息

Javascript 在 Mac cocoa 应用程序中向 objective-c 发送消息

java - Windows SmartScreen 阻止我的 EXE 文件。有什么解决方案吗?

Android 在 textMultiLine 换行时增加父级的高度

java - 回收站 View 不显示 Youtube 视频

android - 在 Android WebView 中加载页面时如何使用后退按钮?