全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android WebView自定义长按选择实现收藏/分享选中文本功能

效果图(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长按保存下载网络图片  # 自定义  # 弹出  # 会在  # 来吧  # 回调  # 小编  # 自己的  # 这是  # 实现了  # 也不  # 是在  # 好了  # 第一个  # 也没  # 在此  # 其他的  # 并在  # 是从  # 感兴趣  # 这两个 


相关文章: 制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  如何续费美橙建站之星域名及服务?  西安大型网站制作公司,西安招聘网站最好的是哪个?  建站之星会员如何解锁更多建站功能?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  c++怎么用jemalloc c++替换默认内存分配器【性能】  C++时间戳转换成日期时间的步骤和示例代码  想学网站制作怎么学,建立一个网站要花费多少?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  如何快速重置建站主机并恢复默认配置?  建站之星如何优化SEO以实现高效排名?  如何通过虚拟主机快速完成网站搭建?  孙琪峥织梦建站教程如何优化数据库安全?  较简单的网站制作软件有哪些,手机版网页制作用什么软件?  如何有效防御Web建站篡改攻击?  建站之星如何取消后台验证码生成?  如何用PHP快速搭建CMS系统?  建站之星24小时客服电话如何获取?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  安云自助建站系统如何快速提升SEO排名?  如何快速搭建响应式可视化网站?  ,网页ppt怎么弄成自己的ppt?  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  如何在宝塔面板中创建新站点?  建站中国官网:模板定制+SEO优化+建站流程一站式指南  网站制作员失业,怎样查看自己网站的注册者?  建站之星客服服务时间及联系方式如何?  清除minerd进程的简单方法  html制作网站的步骤有哪些,iapp如何添加网页?  如何在企业微信快速生成手机电脑官网?  建站之星价格显示格式升级,你的预算足够吗?  如何快速生成可下载的建站源码工具?  如何用已有域名快速搭建网站?  网站制作费用多少钱,一个网站的运营,需要哪些费用?  如何通过可视化优化提升建站效果?  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  定制建站价位费用解析与套餐推荐全攻略  如何在Windows 2008云服务器安全搭建网站?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  b2c电商网站制作流程,b2c水平综合的电商平台?  如何在IIS管理器中快速创建并配置网站?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  太原网站制作公司有哪些,网约车营运证查询官网?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  网站制作免费,什么网站能看正片电影?  如何通过wdcp面板快速创建网站?  c# Task.ConfigureAwait(true) 在什么场景下是必须的 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。