【问题标题】:Enable longClick in WebView在 WebView 中启用 longClick
【发布时间】:2011-03-27 19:40:08
【问题描述】:

在浏览器中,您可以长按 URL。在我的 WebView 中,你不能。我怎样才能做到让你能做到?

【问题讨论】:

    标签: android browser click webview


    【解决方案1】:

    基于@peeyush answer,代码更短:

    webView.setOnLongClickListener { view ->
        val result = (view as WebView).hitTestResult
        extra?.let { link ->
            // do sth with link
        }
        true
    }
    

    【讨论】:

      【解决方案2】:

      我只是想在长按时复制 URL 数据。
      通过参考接受的答案,我写了这个。

          registerForContextMenu(webView);
      
      
      @Override
      public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
          super.onCreateContextMenu(menu, v, menuInfo);
      
          WebView webView = (WebView) v;
          HitTestResult result = webView.getHitTestResult();
      
          if (result != null) {
              if (result.getType() == HitTestResult.SRC_ANCHOR_TYPE) {
                  String linkToCopy = result.getExtra();
                  copyToClipboard(linkToCopy, AppConstants.URL_TO_COPY);
              }
          }
      }
      

      【讨论】:

        【解决方案3】:

        我遇到了同样的问题。

        很遗憾,我找不到让标准浏览器菜单选项出现的方法。你必须自己实现每一个。我所做的是使用activity.registerForContextMenu(webView) 为上下文菜单注册 WebView。然后我继承了 WebView 并覆盖了这个方法:

        @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(0, ID_SAVEIMAGE, 0, "Save Image").setOnMenuItemClickListener(handler);
                menu.add(0, ID_VIEWIMAGE, 0, "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(0, ID_SAVELINK, 0, "Save Link").setOnMenuItemClickListener(handler);
                menu.add(0, ID_SHARELINK, 0, "Share Link").setOnMenuItemClickListener(handler);
            }
        }
        

        如果您想执行上下文菜单以外的操作,请使用OnLongClickListener。但是你想拦截长点击事件,HitTestResult 是关键。这样您就可以了解用户点击了什么并对其进行操作。

        我自己并没有真正实现“保存链接”,我只是把它作为一个例子在这里。但要这样做,您必须自己完成所有处理;您必须发出 HTTP GET 请求,接收响应,然后将其存储在用户 SD 卡的某个位置。据我所知,没有办法直接调用浏览器应用程序的下载活动。您的“保存链接”代码将如下所示:

        HitTestResult result = getHitTestResult();
        HttpClient httpclient = new DefaultHttpClient();
        HttpGet httpget = new HttpGet(result.getExtra());
        HttpResponse response = httpclient.execute(httpget);
        HttpEntity entity = response.getEntity();
        if (entity != null) {
            URL url = new URL(result.getExtra());
        
            //Grabs the file part of the URL string
            String fileName = url.getFile();
        
            //Make sure we are grabbing just the filename
            int index = fileName.lastIndexOf("/");
            if(index >= 0)
                    fileName = fileName.substring(index);
        
            //Create a temporary file
            File tempFile = new File(Environment.getExternalStorageDirectory(), fileName);
            if(!tempFile.exists())
                    tempFile.createNewFile();
        
            InputStream instream = entity.getContent();
            BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
            //Read bytes into the buffer
            ByteArrayBuffer buffer = new ByteArrayBuffer(50);
            int current = 0;
            while ((current = bufferedInputStream.read()) != -1) {
                    buffer.append((byte) current);
            }
        
            //Write the buffer to the file
            FileOutputStream stream = new FileOutputStream(tempFile);
            stream.write(buffer.toByteArray());
            stream.close();
        }
        

        【讨论】:

        • 我还不能测试这段代码,因为我在哪里,但是你必须为那些菜单选项编写代码吗?例如保存链接?如果是这样,你是怎么做到的?
        • 是的......这真的很不幸,但这是我能够做到的唯一方法。我会在我的答案中添加更多细节。
        • 我决定使用 webView 的全部原因是因为网站正在检查引用者,而我无法使用 HttpClient 来欺骗它。有没有办法检查 URL,或者用网络浏览器打开它,或者创建一个上下文菜单?
        • 编辑我看到 getExtra 获取 URL。如果它不是我想用 HttpClient 处理的类型,我可以从这里将它发送到浏览器吗?
        • 我不知道您是否可以自己创建菜单而无需 Activity 为您创建它。但是,如果您不向菜单中添加任何项目,则不会显示它,因此在onCreateContextMenu 中,您可以查看hitResult.getExtra() 给出的 URL,然后决定是否要创建菜单项或启动浏览器。
        【解决方案4】:

        我认为你可以使用这样的东西:

        WebView yourWebView;
        yourWebView.setLongClickable(true);
        yourWebView.setOnLongClickListener(...);
        

        这应该可以让您捕捉到对视图的长时间点击。之后你会做什么......这取决于你!

        【讨论】:

        • 我可以看到标准的 Android 菜单吗?我可以选择并只保留保存链接吗?
        【解决方案5】:

        我会在 webview 中启用 Javascript。然后使用 onMouseDown() 和 onMouseUp() 来确定点击的时长。

        您也可以在 Javascript 中创建弹出菜单(不是标准菜单,而是您自己的)。

        您终于可以在 Javascript 和您的 Android/Java 代码之间进行交互了。

        Javascript 和 Android 应用程序之间的简单交互示例。

        http://code.google.com/p/apps-for-android/source/browse/trunk/Samples/WebViewDemo/assets/demo.html

        http://code.google.com/p/apps-for-android/source/browse/trunk/Samples/WebViewDemo/src/com/google/android/webviewdemo/WebViewDemo.java


        或者,您可能想要启动真正的浏览器而不是使用 WebView。

        Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://example.com"));
        startActivity(intent);
        

        【讨论】:

        • 我可以使用 Javascript 方法看到标准的 android 菜单吗?
        • 我可以选择,只保留保存链接吗?此外,这在使用 OvverideUrlLoading 时会起作用吗?
        • 我不知道如何弹出标准浏览器菜单(除非您启动实际浏览器)
        猜你喜欢
        • 1970-01-01
        • 2021-10-23
        • 1970-01-01
        • 1970-01-01
        • 2021-04-14
        • 1970-01-01
        • 2012-02-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多