[转]WebView长按弹出复制粘贴

ActionMode简介

ActionMode是android3.0之后出现的一种菜单选择模式

ActionMode的创建

ActionMode的使用特别的简单,主要用到两个方法,startActionMode和ActionMode.Callback(),startActionMode:开启我们的菜单,ActionMode.Callback方法中主要有四个方法,详情和介绍看下面的代码:

ActionMode.Callback mCallback=new ActionMode.Callback(){/*** 创建菜单的样式,返回true说明创建成功* @param actionMode* @param menu* @return*/@Overridepublic boolean onCreateActionMode(ActionMode actionMode, Menu menu) {MenuInflater menuInflater = actionMode.getMenuInflater();menuInflater.inflate(R.menu.action_mode,menu);return true;}@Overridepublic boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {return false;}/*** 当ActionMode的条目被点击的时候,调用这个方法* @param actionMode* @param menuItem* @return*/@Overridepublic boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {return false;}/*** 当ActionMode被销毁的时候调用* @param actionMode*/@Overridepublic void onDestroyActionMode(ActionMode actionMode) {if(actionMode!=null){actionMode.finish();}}};

 

然后

 

通过startActionMode(mCallback);方法调用就可以了,就是这么简单

ActionMode遇到的坑

当ActionMode和ToolBar一块使用的时候,心情就不是那么的愉快了...,我们会看到下面的效果

Toolbar被挤压下去了,是不是感觉安卓太坑了...

 

不用着急,我们还是有解决办法滴,我们要确保几件事情:

(1)我们的Activity继承AppCompatActivity

(2)设置主题,保证我们的ActionMode显示在Toolbar上面

<item name="windowActionModeOverlay">true</item>
此外我们可以在主题当中设置我们的ActionMode的样式(高度,背景颜色,logo等)
<style name="actionModeStyle" ><!--设置AcitonMode的背景颜色--><item name="background">@color/color_999999</item><item name="backgroundSplit">?attr/actionModeSplitBackground</item><!--设置ActionMode的高度--><item name="height">64dp</item><item name="titleTextStyle">@style/TextAppearance.AppCompat.Widget.ActionMode.Title</item><item name="subtitleTextStyle">@style/TextAppearance.AppCompat.Widget.ActionMode.Subtitle</item><!--设置ActionMode的左边图标--><item name="closeItemLayout">@layout/abc_action_mode_close_item_material</item></style>

WebView中的ActionMode(实现长按复制文本的功能)

ActionMode在webview上面,Android6.0之前和之后发生了一些变化,6.0之后的更加友好

Android6.0之前的样式就是我们上图那幅图片所展示的

 

实现自定义ActionMode

继承WebView,重写startActionMode方法,拦截我们的ActionMode对象,然后对此进行一些处理就可以了,直接上代码

@Overridepublic ActionMode startActionMode(ActionMode.Callback callback) {ActionMode actionMode = super.startActionMode(callback);return resolveMode(actionMode);}@Overridepublic ActionMode startActionMode(ActionMode.Callback callback, int type) {ActionMode actionMode = super.startActionMode(callback, type);return resolveMode(actionMode);}public ActionMode resolveMode(ActionMode actionMode) {if(actionMode!=null){final Menu menu = actionMode.getMenu();menu.clear();for (int i = 0; i < title.length; i++) {menu.add(title[i]);}for (int i = 0; i < title.length; i++) {MenuItem item = menu.getItem(i);item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {@Overridepublic boolean onMenuItemClick(MenuItem menuItem) {String title = menuItem.getTitle().toString();getSelectedData(title); //获取选中的h5页面的文本releaseActionMode();return true;}});}this.mActionMode = actionMode;}return actionMode;}

当点击ActionMode的item的之后,将我们的actionMode finish掉

 public void releaseActionMode() {if (mActionMode != null) {mActionMode.finish();mActionMode = null;}}

获取h5页面的文本信息

获取h5页面的文本信息,需要使用到js方法来帮助我们实现这些功能,然后在通过js和java交互回传我们的文本内容(js和java如何交互,这里就不多说了......)

/*** 点击的时候,获取网页中选择的文本,回掉到原生中的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;" +"}" +"ActionModeJavaScript.callback(txt,title);" +           //回调java方法将js获取的结果传递过去"})()";if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {  //android系统4.4以上的时候调用js方法用这个evaluateJavascript("javascript:" + js, null);} else {loadUrl("javascript:" + js);}}

源码

参考文章:

 

http://blog.csdn.net/evan_man/article/details/51685022

http://blog.csdn.net/u012336923/article/details/50865120#%E6%80%BB%E7%BB%93

https://stackoverflow.com/questions/26483778/display-actionmode-over-toolbar

 


---------------------
作者:彼岸人生
来源:CSDN
原文:https://blog.csdn.net/kemeng7758/article/details/77869113?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
版权声明:本文为作者原创文章,转载请附上博文链接! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/285022.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深夜爆肝:万字长文3种语言实现Huffman树(强烈建议三连)

文章目录一、C语言能干大事1. C语言下Huffman树的计算过程分析2. C语言下Huffman树的编程二、C#语言也不赖1. C#下Huffman类的设计2. C#中界面设计3. 建立测试数据并显示Huffman树4. 输入任意一组数据&#xff0c;完成构造Huffman树三、JavaScript语言不爱听了1. JavaScript下H…

C语言试题179之实现堆排序算法

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款刷算法、笔试、面经、拿大公司offer神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目: 实现堆…

SQL Server Update 所有表的某一列(列名相同,类型相同)数值

DECLARE sql VARCHAR(5000); WITH T AS (SELECT SchemaName c.TABLE_SCHEMA,TableName c.TABLE_NAME,ColumnName c.COLUMN_NAME,DataType DATA_TYPE,sql update c.TABLE_NAME set c.COLUMN_NAME 2017-11-20 -----------执行语句FROM INFORMATION_SCHEMA.COLUMNS …

C语言试题180之实现实现字符串strcpy函数

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款刷算法、笔试、面经、拿大公司offer神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目: 实现字…

[转]关于数据中台、数据平台、数据仓库、数据湖等数据概念的对比解析

前言 2010年左右&#xff0c;还是在上学的时候&#xff0c;学过一门课程叫《数据仓库与数据挖掘》&#xff0c;那还是属于传统数据的时代&#xff0c;我们会讨论什么是数据仓库&#xff1f;什么是数据集市&#xff1f;数据仓库和数据库有什么区别&#xff1f;等等&#xff0c;…

【微服务专题之】.Net6下集成消息队列-RabbitMQ交换机模式代码演示(全)

微信公众号&#xff1a;趣编程ACE关注可了解更多的.NET日常实战开发技巧&#xff0c;如需源码 请公众号后台留言 源码;[如果觉得本公众号对您有帮助&#xff0c;欢迎关注].Net中RabbitMQ中交换机模式的使用前文回顾【微服务专题之】.Net6下集成消息队列上-RabbitMQ【微服务专题…

【专升本计算机】甘肃省专升本计算机基础--判断题--汇编(737道带答案)

冯•诺依曼原理是计算机的唯一工作原理。(  )计算机能直接识别汇编语言程序。(  )计算机能直接执行高级语言源程序。(  )计算机掉电后,ROM中的信息会丢失。(  )计算机掉电后,外存中的信息会丢失。( √ )应用软件的作用是扩大计算机的存储容量。(  )操…

thinkphp中表有前缀名的时候申明模板的方法

$Modelnew \Home\Model\Stu_activityModel; $ModelD(Stu_activity);//错误的声明不了转载于:https://www.cnblogs.com/jianxin-lilang/p/6242416.html

OK335xS psplash make-image-header.sh hacking

/****************************************************************************** OK335xS psplash make-image-header.sh hacking* 说明&#xff1a;* 移植的时候想知道移植psplash中./make-image-header.sh Screenshot.png POKY* 最后的POKY为什么要指定&am…

SDWebImage 4 0 迁移指南

刚刚更新pods 编译程序,突然发现SDWebImage报错 了解到SDWebImage4.0 更换了不少方法&#xff0c;还增加了几个类&#xff0c;索性都研究一下pod 更新SDWebImage版本为4.1.0 查找是否有对应缓存的 方法 由返回BOOL 值 换成Block回调中参数返回BOOL值 //老版本 BOOL isInCache …

C语言试题181之实现strcat函数

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款刷算法、笔试、面经、拿大公司offer神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目: 实现st…

通宵爆肝:C语言下的平衡二叉树(Avl)原来如此简单!

文章目录平衡二叉树的构造过程1 算法描述平衡二叉树的编程1 树上结点的高度计算2 LL调整函数3 RR调整函数4 LR调整函数5 RL调整函数6 根据结点的值、动态构造平衡二叉树平衡二叉树的构造过程 对一个查找问题而言&#xff0c;查找表的存储结构、应该组织成二叉树结构。而把一个…

[转]定了!2020年,6种将死的编程语言!

随着年度复工大戏的开播&#xff0c;编程界语言排行榜又要面临一次全新的洗牌&#xff0c;六大编程语言将要黄了&#xff01;此消息一出&#xff0c;令众多程序员心碎&#xff01;那么这将“亡”的六大语言中有你所擅长的吗&#xff1f; Perl 曾几何时&#xff0c;几乎每个人都…

Java研发方向如何准备BAT技术面试答案(上)

http://blog.csdn.net/q979392157/article/details/52164319 阿里面试题总结 http://blog.csdn.net/q979392157/article/details/52173812 JAVA多线程和并发基础 http://blog.csdn.net/q979392157/article/details/52104466 转载于:https://www.cnblogs.com/Berryxiong/p/6…

正式发布丨AKS上的Dapr、ML、Gitops扩展

点击上方蓝字关注我们&#xff08;本文阅读时间&#xff1a;5分钟)我们很高兴地宣布在 Azure Kubernetes  Service&#xff08;以下简称AKS&#xff09;上启用的 Dapr、Azure 机器学习和 GitOps 三项新功能正式发布&#xff0c;可以通过称为“集群扩展”的功能在 AKS 集群上启…

【BZOJ3036】绿豆蛙的归宿 概率DP

链接&#xff1a; #include <stdio.h> int main() {puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢");puts("网址&#xff1a;blog.csdn.net/vmurder/article/details/46467217"); } 题解&#xff1a; 呃。拓扑图上从后往前扫就好了Qwq 代码…

C语言试题182之统计一串字符包含the的个数

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款刷算法、笔试、面经、拿大公司offer神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目: 统计一…

Mac上怎么把mov文件转成gif文件

前言 在github上&#xff0c;我们发现很多开源库的readme里都有gif文件&#xff0c;平时聊天我们也发现经常有些小伙伴发一些自制的gif文件。怎么把mov&#xff0c;MP4等其他格式的文件转为gif文件呢&#xff1f;网上有很多介绍各种软件的&#xff0c;大家可以随便Google一下&a…

[转]nginx反向代理网站(网易、百度之类的)

使用nginx反向代理百度之类的网站和反向代理自己发布的服务设置上有点差别&#xff0c;因为此差别费时良久&#xff0c;故记录在此。 使用include 配置文件方式&#xff0c; 首先在 nginx.conf文件的 http 中 加入&#xff0c; include /etc/nginx/proxy34.conf;p…

【ArcGIS Pro微课1000例】0013:NOAA全球1km分辨率DEM下载及拼接教程(附已拼接成果下载地址)

文章目录 一、全球1km分辨率DEM拼接成果介绍二、全球1km分辨率DEM原始数据下载三、全球1km分辨率DEM处理拼接流程四、全球1km分辨率DEM下载地址一、全球1km分辨率DEM拼接成果介绍 在ArcGIS Pro中加载拼接好的全球1km分辨率DEM数据集,如下图所示: 三维显示: 栅格源信息如下:…