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
版权声明:本文为作者原创文章,转载请附上博文链接!

[转]WebView长按弹出复制粘贴相关推荐

  1. vue 长按复制文字 并弹出复制成功

    在vue中,使用长按复制文字需要用到两个方法: touchstart.手指放上去的动作 touchend.手指离开的动作 监听两个方法的间隔时间则可以达到长按触发的效果. <span @touc ...

  2. 移动端web 禁止长按弹出的菜单 Safari

    这是一个系列,记录我前端开发常用的代码,小常识,有些是参考网上代码,(讲的可能有点烂,求不要打脸,嘤嘤嘤~~)送给那些需要的人.可以相互交流,喜欢的加我吧. Wx: Lxp911221 如果是禁用长按 ...

  3. android EditText 屏蔽长按弹出剪切 复制 全选菜单 的解决办法

    最近自定义一个密码输入框,正方形的那种,遇到了长按会弹出系统的剪切 复制 和全选的菜单的问题,下面说一下解决办法: 只要设置 edittext.setCustomSelectionActionMode ...

  4. EditText 长按弹出的上下文菜单

    当EditText获取焦点后,如果长按EditText就会弹出一个上下问菜单 如果剪贴板上没有内容的话,就不会有粘帖选项,否则就会有粘帖选项 ClipboardManager cm = (Clipbo ...

  5. ios3怎么取消长按弹出菜单_苹果:iOS13取消3D-Touch重压改为长按只是个BUG~

    原标题:苹果:iOS13取消3D-Touch重压改为长按只是个BUG~ 目前iOS 13中3D-Touch功能在桌面级菜单采用的是类似iPhone XR的触觉感应(Haptic touch),用户只需 ...

  6. ios3怎么取消长按弹出菜单_iPhone一直跳出通知好烦?教你如何关闭/管理iOS通知...

    原标题:iPhone一直跳出通知好烦?教你如何关闭/管理iOS通知 如果不特别留意iPhone 的通知,你会发现的屏幕画面不知不觉被一大堆有的没的App 占据了,每次解锁前都会被讯息轰炸一次-而且用手 ...

  7. ios3怎么取消长按弹出菜单_ios13长按多功能怎么关闭-手机数据恢复精灵

    ios13系统相对于ios12系统作出的改变可以说是很大的,有很多iphone用户在更新到ios13系统之后有很多功能不知道怎么使用,也不知道怎么关闭,那么ios13长按多功能怎么关闭呢?ios13长 ...

  8. 使用clipboard.js实现移动端页面一键复制功能 + 弹出复制成功提示

    最近再写一个简单的html官网移动端页面,需求是一键复制邀请码,再百度上找了好多例子 各种尝试 然后找到一种可以解决的办法 html部分 <input type="text" ...

  9. android 点击edittext全选,Android - 阻止edittext复制/粘贴,然后双击全选

    我正在寻找一个解决方案来禁用长按编辑菜单(复制/粘贴)以及双击select-all功能的edittext框.我已经在这里以类似的方式阅读了这个问题的一些解决方案,但是,需要更进一步. 对于这个应用程序 ...

最新文章

  1. 企业级应用能帮助闪存走出产能过剩时代吗?
  2. 华为应用锁退出立即锁_面试官:你说说互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景...
  3. 后端:REST API URI 设计的七准则
  4. HDFS的读/写流程
  5. mysql 主从一致性_mysql 主从一致性保证
  6. #{}不自动改参数类型_Spring参数的自解析还在自己转换?你out了!
  7. 坑爹的RockSaw和坑爹的windows7
  8. 中国顶级***--小榕
  9. 发票识别系统流程以及应用场景
  10. python中的df是什么意思_python数据分析之pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]...
  11. 扫地机器人的喋血江湖
  12. ONF测试工作张攀:OpenFlow控制器性能测试工具进展
  13. coding coffee HTML文档
  14. 使用java搭建简单的ligerui环境
  15. 上面一个星星下面一个r_谁能告诉我微博那个红色五角星有个R?
  16. Windos环境下kafka配置启动Zookeeper时,报错:Invalid config, exiting abnormally.
  17. 洛谷 P3355 骑士共存问题
  18. honor 5c recovery nem-tl00h-recovery-twrp3.3.1-0.img
  19. MATLAB常用绘图命令
  20. 采用开源工具学习51单片机

热门文章

  1. 记录一下(session共享的文章,wcf记录一下学习地址,Firebug)
  2. 成功测试管理者的九大原则
  3. 可能是.NET领域性能最好的对象映射框架——Mapster
  4. 使用 System.Net.Http.Json 简化 HttpClient 的使用
  5. 如何做到 byte[] 和 十六进制 互转?
  6. 微服务的终极目标,Mecha分布式运行时之Dapr
  7. ASP.NET Core依赖注入初识与思考
  8. CAP-微服务间通信实践
  9. WPF MVVM 弹框之等待框
  10. 研发协同平台数据库死锁处理及改进