android - 在 WebView 中启用长按

标签 android browser click webview

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

最佳答案

我遇到了同样的问题。

不幸的是,我找不到使标准浏览器菜单选项出现的方法。你必须自己实现每一个。我所做的是使用 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 卡上的某个位置。据我所知,无法直接调用浏览器应用程序的下载 Activity 。您的“保存链接”代码将如下所示:

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

关于android - 在 WebView 中启用长按,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3449098/

相关文章:

java - 文件没有从 android 上传到 php 服务器

android - 重新创建 Activity 在 Android 9 上引发黑屏

java - fragment 上的可点击按钮..."has no zero argument constructor"?尝试了我在 stackoverflow 上看到的所有内容

Android ActionBar - 如何检查当前可见的操作栏按钮数量?

android - 如果立即崩溃,如何使用 GDBSERVER 调试 Android 浏览器?

android - 系统重启我的进程后 AppWidget 点击丢失

php - 是否/是否有任何浏览器允许控制流构造在脚本标签中存活?

html - 如何判断浏览器是否处于 "quirks"模式?

Jquery新窗口点击事件

c# - 当非双击时如何处理 WinForms 控件单击事件