效果图(1.3M)
一、前言
** 戳这里可以去DEMO,来吧 **
相信刚接触android不久的同志们,在面对产品提出的 :
“自定义WebView页面中,长按文本的弹出选项、点击选择后,分享、转发、收藏选择文本”
这样的需求时,第一反应大部分是:这是系统行为,如果实现需要在web端实现。
但是web端实现的局限性太大,曾经也有过监听系统粘贴板,在用户点击复制的时候实现其他的逻辑,但是这样用户体验不好,所以自定义WebView中长按的弹出菜单,并在点击时返回选中文本的小控件闪亮登场┏ (^ω^)=。
二、自定义长按弹出菜单
这一步实现其实很简单,首先创建一个CustomActionWebView继承系统WebView,然后重写下面两个方法。
这两个方法会在用户长按选择web文本时,在弹出菜单前被调用。它们之间的区别在于,第一个方法的菜单弹出方式,指定了默认的type。我们并不关心弹出的item类型是什么,我们只需要拦截下来ActionMode,然后返回我们自己的自定义ActionMode即可。
@Override
public ActionMode startActionMode(ActionMode.Callback callback) {
ActionMode actionMode = super.startActionMode(callback);
return resolveActionMode(actionMode);
}
@Override
public ActionMode startActionMode(ActionMode.Callback callback, int type)
ActionMode actionMode = super.startActionMode(callback, type);
return resolveActionMode(actionMode);
}
这里我们所做的事是:
1、把原本的actionMode对象保存到mActionMode中。
2、清空原本actionMode中的MenuItem。
3、添加我们自定义的item到actionMode中。
4、重定义每个menuItem的点击事件。
5、在点击事件中通过执行js,获取选中文本。
6、通过上面保存的 mActionMode,释放弹出菜单(不释放会内存泄漏)。
7、返回新填充的actionMode给系统。
/**
* 处理item,处理点击
* @param actionMode
*/
private ActionMode resolveActionMode(ActionMode actionMode) {
if (actionMode != null) {
final Menu menu = actionMode.getMenu();
mActionMode = actionMode;
menu.clear();
for (int i = 0; i < mActionList.size(); i++) {
menu.add(mActionList.get(i));
}
for (int i = 0; i < menu.size(); i++) {
MenuItem menuItem = menu.getItem(i);
menuItem.setOnMenuItemClickListener(new Item.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
getSelectedData((String) item.getTitle());
releaseAction();
return true;
}
});
}
}
mActionMode = actionMode;
return actionMode;
}
实现效果
三、获取选中文本
光自定义菜单,拿不到选中文本也没意义,那么如何获取选中文本呢?这里如果不转个弯,还真会在南墙在撞死( ̄^ ̄)ゞ,所以,我们伟大的js就出现了。
首先,我们自定义一个接口,用于监听js方法,其中@JavascriptInterface是关键的所在, 在callback中获取js端返回的数据。
然后将这个接口,在CustomActionWebView中add进去(一般是在初始化和页面加载完成时都add一次),并指定js端调用的接口名称为“ JSInterface”。(ps:别忘了开始webview的js允许哦。)
public void linkJSInterface() {
addJavascriptInterface(new ActionSelectInterface(this), "JSInterface");
}
···
/**
* js选中的回调接口
*/
private class ActionSelectInterface {
CustomActionWebView mContext;
ActionSelectInterface(CustomActionWebView c) {
mContext = c;
}
@JavascriptInterface
public void callback(final String value, final String title) {
if(mActionSelectListener != null) {
mActionSelectListener.onClick(title, value);
}
}
}
最后在点击时,通过执行js来获取web中选中的文本。在上面自定义菜单中第5项,点击menu时,执行下方js代码,便可以把选中的item和文本,回调到上面的接口中的callback。
熟悉js的小伙伴已经看出来吧:
其实就是定义了一个js的function,然后在webview中执行这个方法。
定义的这个名为function getSelectedText()的js方法,有两个变量:txt和title。
title是从原生中传入的item名字,txt是通过window去获取web中选中的文本。
最后回到上面我们注册的js方法名JSInterface,通过它的callback方法,将文本和name返回到原生代码callback中。
根据版本不同,执行js方法的接口也不一样。
/**
* 点击的时候,获取网页中选择的文本,回掉到原生中的js接口
* @param title 传入点击的item文本,一起通过js返回给原生接口
*/
private void getSelectedData(String title) {
String js = "(function getSelectedText() {" +
"var txt;" +
"var title = \"" + title + "\";" +
"if (window.getSelection) {" +
"txt = window.getSelection().toString();" +
"} else if (window.document.getSelection) {" +
"txt = window.document.getSelection().toString();" +
"} else if (window.document.selection) {" +
"txt = window.document.selection.createRange().text;" +
"}" +
"JSInterface.callback(txt,title);" +
"})()";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
evaluateJavascript("javascript:" + js, null);
} else {
loadUrl("javascript:" + js);
}
}
四、最后
既然自定义item实现了,点击和选择文本返回也实现了,在callback中,你就可以愉悦的收藏,或者分享你所选中的文本啦(◐‿◑),操作一气呵成,有没有被惊艳到呢?
如果感兴趣的,可以下载demo看下,同时CustomActionWebView也封装好了远程依赖,欢迎使用。
https://github.com/CarGuo/CustomActionWebView
以上所述是小编给大家介绍的Android WebView自定义长按选择实现收藏/分享选中文本功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# android
# webview
# 自定义长按选择
# Android WebView实现长按保存图片及长按识别二维码功能
# Android使用webView长按保存下载网络图片
# 自定义
# 弹出
# 会在
# 来吧
# 回调
# 小编
# 自己的
# 这是
# 实现了
# 也不
# 是在
# 好了
# 第一个
# 也没
# 在此
# 其他的
# 并在
# 是从
# 感兴趣
# 这两个
相关文章:
公司网站设计制作厂家,怎么创建自己的一个网站?
一键网站制作软件,义乌购一件代发流程?
整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?
免费ppt制作网站,有没有值得推荐的免费PPT网站?
如何通过主机屋免费建站教程十分钟搭建网站?
建站之星如何快速生成多端适配网站?
如何在腾讯云服务器上快速搭建个人网站?
开心动漫网站制作软件下载,十分开心动画为何停播?
如何通过商城自助建站源码实现零基础高效建站?
网站建设制作、微信公众号,公明人民医院怎么在网上预约?
电脑免费海报制作网站推荐,招聘海报哪个网站多?
内部网站制作流程,如何建立公司内部网站?
如何在橙子建站上传落地页?操作指南详解
制作充值网站的软件,做人力招聘为什么要自己交端口钱?
宝塔新建站点报错如何解决?
GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?
网站网页制作专业公司,怎样制作自己的网页?
如何在阿里云服务器自主搭建网站?
,购物网站怎么盈利呢?
如何用狗爹虚拟主机快速搭建网站?
如何快速搭建高效WAP手机网站?
如何用y主机助手快速搭建网站?
如何快速搭建响应式可视化网站?
网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站之星导航菜单设置与功能模块配置全攻略
如何在企业微信快速生成手机电脑官网?
香港服务器网站卡顿?如何解决网络延迟与负载问题?
网站按钮制作软件,如何实现网页中按钮的自动点击?
济南网站制作的价格,历城一职专官方网站?
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
如何快速搭建FTP站点实现文件共享?
高端建站三要素:定制模板、企业官网与响应式设计优化
威客平台建站流程解析:高效搭建教程与设计优化方案
如何通过NAT技术实现内网高效建站?
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
建站之星安装后如何配置SEO及设计样式?
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
如何快速搭建高效服务器建站系统?
个人摄影网站制作流程,摄影爱好者都去什么网站?
如何选择服务器才能高效搭建专属网站?
阿里云网站制作公司,阿里云快速搭建网站好用吗?
如何通过免费商城建站系统源码自定义网站主题与功能?
如何在Golang中使用encoding/gob序列化对象_存储和传输数据
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
Java解压缩zip - 解压缩多个文件或文件夹实例
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
高性价比服务器租赁——企业级配置与24小时运维服务
装修招标网站设计制作流程,装修招标流程?
*请认真填写需求信息,我们会在24小时内与您取得联系。