Android Webview,仅在链接上启用长点击?

Posted

技术标签:

【中文标题】Android Webview,仅在链接上启用长点击?【英文标题】:Android Webview, Setting Long Click enabled on links exclusively? 【发布时间】:2013-06-12 03:18:25 【问题描述】:

与其他浏览器(如 Chrome 和 Firefox)类似,我需要用户长按链接然后显示上下文菜单,但如果他们长按某个链接但它不是链接,则什么也不做。

使用registerForContextMenu(myWebView); 允许长时间单击我不想要的任何对象。因此,我认为需要从registerForContextMenu(myWebView); 中过滤对象或解析html 中的链接,这似乎有些矫枉过正。我也尝试过覆盖shouldOverrideUrlLoadingmethod:

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

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

【问题讨论】:

什么是forumview? forumview == webView :) 【参考方案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;
        

请注意,通过使用result.getExtra(),您将从 WebView 中检索过滤后的结果,在本例中为 a HTML::a tag with src=http。 请注意,我还通过返回 true(已处理)来忽略 WebView 上的任何其他长时间点击。

【讨论】:

以上是关于Android Webview,仅在链接上启用长点击?的主要内容,如果未能解决你的问题,请参考以下文章

相对链接上的 Android WebView 新窗口空 URL

Android:WebView - 没有为会议启用摄像头和麦克风

如何在android的webview中启用前置摄像头

嵌入式谷歌地图无法在 WebView 中获取当前位置

在 WebView Android 中键入时播放声音

仅在 Flutter Web 上重定向