[转]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语言试题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【微服务专题…

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;几乎每个人都…

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

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

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

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

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

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

国际主流产品信息管理规范SMBIOS支持LoongArch架构

SMBIOS支持龙架构&#xff08;LoongArch™&#xff09;龙芯生态标准统一近日&#xff0c;DMTF&#xff08;分布式管理任务组&#xff09;宣布SMBIOS规范支持龙架构&#xff08;LoongArch™&#xff09;&#xff0c;自此基于龙架构平台开发的基础硬件信息都将规范统一显示&#…

Git 常用命令(二)

用 git init 在目录中创建新的 Git 仓库。 $ mkdir test $ cd test/ $ git init Initialized empty Git repository in /Users/chenm/www/test/.git/ # 在 /www/test/.git/ 目录初始化空 Git 仓库完毕。 可以看到在你的项目中生成了 .git 这个子目录(隐藏文件)。 这就是你的 Gi…

【ArcGIS Pro微课1000例】0014:两种坐标系全国1km分辨率DEM下载地址(WGS84+Albers投影)

本文提供两种坐标系全国1km分辨率DEM下载地址(WGS84+Albers投影)。 文章目录 全国1km分辨率DEM数据预览WGS84地理坐标系Albers投影坐标系全国1km分辨率DEM数据下载全国1km分辨率DEM数据预览 WGS84地理坐标系 三维显示: 栅格信息:

AsyncTask的使用半解--!

AsyncTask,即异步任务,是Android给我们提供的一个处理异步任务的类.通过此类,可以实现UI线程和后台线程进行通讯,后台线程执行异步任务,并把结果返回给UI线程. .为什么需要使用异步任务? 我们知道,Android中只有UI线程,也就是主线程才能进行对UI的更新操作,而其他线程是不能直…

Andorid与webView交互,获取webView选中文字,兼容了iframe

js调试效果&#xff1a; 下面主要是拼装js代码 &#xff1a; /** * Description 获取webView选中文字内容 * param webView* param callBack*/public static void webViewGetSelectedData(WebView webView,webViewGetSelectedDataCallBack callBack) {String js "function…

C语言试题183之编写一个程序,从标准的输入读取一些字符,并统计下各类字符所占的百分比

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

【ArcGIS Pro微课1000例】0015:ArcGIS Pro中属性字段分式标注案例教程

文章目录 1. 符号化2. 属性字段分式标注在ArcGIS及Pro中很容易实现格式化标签的,本文讲解在ArcGIS Pro中实现属性字段分式标注,结果如下图所示: 1. 符号化 右键数据图层→符号系统,打开符号系统对话框,住符号系统选择【唯一值】,字段1选择NAME。 2. 属性字段分式标注 加…

C语言试题184之编写一个函数,从标准输入读取一个字符串,把字符串复制到动态内存分配的内存中,并返回该字符串的拷贝,这个函数不应该对读入字符串的长度作任何限制

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

[转]Linux面试题(2020最新版)

文章目录 Linux 概述 什么是LinuxUnix和Linux有什么区别&#xff1f;什么是 Linux 内核&#xff1f;Linux的基本组件是什么&#xff1f;Linux 的体系结构BASH和DOS之间的基本区别是什么&#xff1f;Linux 开机启动过程&#xff1f;Linux系统缺省的运行级别&#xff1f;Linux 使…

MSBuild 命令的简单使用

MSBuild 命令的简单使用独立观察员 2022 年 7 月 7 日位置在 VS 安装目录下&#xff0c;如&#xff1a;D:Microsoft Visual Studio2022EnterpriseMSBuildCurrentBin命令MSBuild 命令行参考 - MSBuild | Microsoft Docs&#xff08;https://docs.microsoft.com/zh-cn/visualstud…