Android:WebView中对图片注册上下文菜单
前言
今天一朋友问我一个问题,就是如何在WebView控件中的图片增加上下文菜单,以便增加保存图片等功能。今天就给他简单做了一个演示Demo,现写下来,给有相同问题的朋友提供些许思路吧。
概要实现
其实这个功能很简单,没有太复杂的东西,就是对WebView的控件的使用,一是给WebView注册了上下文菜单事件,二是在响应事件中去判断事件源的类型,如果是图片类型,则把url取出来
注册上下文菜单事件
这个就比较简单了通过下面的代码即可完成。
WebView vw = (WebView) findViewById(R.id.wv);
this.registerForContextMenu(vw);
取图片URL
这部分的重点就是,只响应图片源的上下文菜单以及取出图片的路径。实现代码如下
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo); WebView w = (WebView)v;
HitTestResult result = w.getHitTestResult();
//只检测图片格式
if(result.getType() == HitTestResult.IMAGE_TYPE){
menu.addSubMenu(1, 1, 1, "保存图片"); //通过result.getExtra()取出URL
strUrl = result.getExtra();
Toast.makeText(getApplicationContext(), strUrl, Toast.LENGTH_SHORT).show();
}
}
重点是:getHitTestResult,先来看下官方说明
Gets a HitTestResult based on the current cursor node. If a HTML::img tag is found, the HitTestResult type is set to IMAGE_TYPE and the URL is set in the "extra" field.
意思是说:根据当前触发的节点(node)获得一个HitTestResult对象。如果触发事件的是一个img标签,那么HitTestResult的类型为IMAGE_TYPE,并且把URL放到了HitTestResult的extra域中。
所以,通过result.getType() == HitTestResult.IMAGE_TYPE这一句话,就可以实现只响应图片事件,而result.getExtra();则可以把图片URL取出来。这样有了URL就可以进行进一步的操作了,比如保存图片等等。
这样,这个功能就简单的实现了。
后记
这是一个只响应图片源的例子,同理,可以做出响应超链接、电话、邮件等事件源的处理动作,下面就把getHitTestResult的完整说明贴下:
Gets a HitTestResult based on the current cursor node. If a HTML::a tag is found and the anchor has a non-JavaScript URL, the HitTestResult type is set to SRC_ANCHOR_TYPE and the URL is set in the "extra" field. If the anchor does not have a URL or if it is a JavaScript URL, the type will be UNKNOWN_TYPE and the URL has to be retrieved through requestFocusNodeHref(Message) asynchronously. If a HTML::img tag is found, the HitTestResult type is set to IMAGE_TYPE and the URL is set in the "extra" field. A type of SRC_IMAGE_ANCHOR_TYPE indicates an anchor with a URL that has an image as a child node. If a phone number is found, the HitTestResult type is set to PHONE_TYPE and the phone number is set in the "extra" field of HitTestResult. If a map address is found, the HitTestResult type is set to GEO_TYPE and the address is set in the "extra" field of HitTestResult. If an email address is found, the HitTestResult type is set to EMAIL_TYPE and the email is set in the "extra" field of HitTestResult. Otherwise, HitTestResult type is set to UNKNOWN_TYPE.
大致意思为:根据当前触发的节点(node)获得一个HitTestResult对象。如果事件源是一个a标签,并且有一个不是JavaScript的URL,那么HitTestResult的类型被设置为SRC_ANCHOR_TYPE,同时把URL放到了extra域中。如果这个a标签没有url或者是一个JavaScript的URL,那么类型被设置为UNKNOWN_TYPE同时Url则会重新获取。如果事件源是一个img标签,那么HitTestResult的类型为IMAGE_TYPE,并且把URL放到了HitTestResult的extra域中。一个SRC_IMAGE_ANCHOR_TYPE类型表明了一个拥有图片为子对象的超链接。如果是一个手机号,那么类型将被设置为PHONE_TYPE,同时手机号被设置到extra域中。如果是一个地图地址,类型则为GEO_TYPE同时地址信息被放到extra中。如果是一个邮件地址,那么类型被设置为EMAIL_TYPE同时emal被设置到extra域中。其他的事件源的类型都为UNKNOWN_TYPE.
完整代码:https://github.com/xiaoai-opensource/WebViewContextMenu
原文连接:http://www.cnblogs.com/luoaz/p/3756160.html
Android:WebView中对图片注册上下文菜单的更多相关文章
- 与众不同 windows phone (16) - Media(媒体)之编辑图片, 保存图片到相册, 与图片的上下文菜单“应用程序...”和“共享...”关联, 与 Windows Phone 的图片中心集成
原文:与众不同 windows phone (16) - Media(媒体)之编辑图片, 保存图片到相册, 与图片的上下文菜单"应用程序..."和"共享..." ...
- ios中,长按Webview中的图片
我们所要解决的问题如题目所示:ios中,长按Webview中的图片,将图片保存到本地相册. 解决方案:对load的html网页,执行js注入,通过在webview中执行js代码,来响应点击事件,通过j ...
- Android WebView中显示一张或多张图片
最近需要在平板中显示多张图片,调查了下,决定用WebView(说实话,我还不清楚有没有其他android控件能够显示多张图片的.....), 主要是用HTML的img来显示多张图片. google百度 ...
- Android WebView中的JavaScript代码使用
在WebView中使用JavaScript 如果你想要载入的页面中用了JavaScript,你必须为你的WebView使能JavaScript. 一旦使能之后,你也可以自己创建接口在你的应用和Java ...
- Android EditText中插入图片并响应点击事件
EditText中插入图片基本就是两种方法: ,通过Html.fromHtml(..)来实现 [mw_shl_code=java,true]eText.append(Html.fromHtml(&qu ...
- Android内存中的图片
图片在内存中的大小 Android.graphics.Bitmap类里有一个内部类Bitmap.Config类,在Bitmap类里createBitmap(intwidth, int height, ...
- Android webView加载图片显示过大的问题
webview的基本使用流程这里我就不重复说明了,本篇针对的是文章详情加载完成后出现的情况,这里我们使用的方法是:通过js脚本,重置img标签中图片的宽度和高度. 使用步骤: 1.此方法需要使用js, ...
- Android Webview中解决H5的音视频不能自动播放的问题
在开发webview的时候,当加载有声音的网页的时候,声音不会自动播放, 解决方法:在webview中调用js方法.这个方法需要在webview的setWebViewClient方法之后在onPage ...
- Android TextView中显示图片
Android官方给我们提供的Html类下面的fromHtml方法 当你需要转换的HTML代码是带图片的,比如<IMG/>,那么你就需要使用到重载的第二个方法了,这个方法里面有个Image ...
随机推荐
- Flume-ng-1.4.0 spooling source的方式增加了对目录的递归检测的支持
因为flume的spooldir不支持子目录文件的递归检测,并且业务需要,所以修改了源码,重新编译 代码修改参考自:http://blog.csdn.net/yangbutao/article/det ...
- iOS runtime 运行时( 二 )
我们在编程过程中,如果使用到了runtime(运行时),我们几乎都是想动态的改变这个类的信息,包括方法,属性,balabala的,并且获得这个类的一些信息,等等,下面我们就来看看怎么通过runtime ...
- Solr高亮显示highlight的三种实现
高亮显示在搜索中使用的比较多,比较常用的有三种使用方式,如果要对某field做高亮显示,必须对该field设置stored=true 第一种是普通的高亮显示Highlighter,根据查询的 ...
- Access to the path '' is denied.解决方案
在本地测试正常,但一上传到服务器上的时候,那个就提示Access to the path ‘路径’ is denied.我在网上找了很多资料,最后终于解决了,原来是因为在该文件的上级文件夹没有修改权限 ...
- struts1标签-<html:radio> 使用注意事项
struts1标签-<html:radio> 使用注意事项 1.默认选中效果 在后台XxxForm中写入如下代码,可保证默认选中效果实现: @Override public void re ...
- Spring学习总结三——SpringIOC容器三
一:spring容器自动装配注入 为了减少xml中配置内容,可以使用自动装配注入,代替setter注入,只需要在 bean对象配置中添加属性autoWire即可,那么在类中就会自动扫描setXXX() ...
- Shell学习笔记 - 循环语句
一.for循环 1. 语法格式1 for 变量 in 值1 值2 值3 ... do 程序 done 说明:程序将遍历所有的值,赋值给变量,然后在执行程序.也就是说,后面接多少个值,程序就循环多少次. ...
- CentOS服务器的16个监控命令
你可以通过图形化用户界面(GUI)程序来获取这些外壳命令提供的大量信息,具体取决于使用哪一种Linux发行版.比如说,SUSE Linux就有一款出色的.图形化配置和管理工具YaST,KDE的KDE ...
- centos下使用nohup
Unix/Linux下一般比如想让某个程序在后台运行,很多都是使用 & 在程序结尾来让程序后台运行.比如我们要运行mysql在后台:/usr/local/mysql/bin/mysqld_sa ...
- zoj 3057 博弈
思路:对于TT来说,如果数量分别为a a b或 a b a,或 b a a的形式,那么TT必赢,因为TT可以使其成为 a a a的形式,那么不论DD 怎么拿,都是TT最后使其成为a a a 的形式,0 ...