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自定义长按选择实现收藏/分享选中文本功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • 详解Android WebView加载html片段

    这里我先简单描述一下需求:服务器返回的是html页面的一部分带有标签的内容. 解决的思路是:将服务器返回的内容片段拼凑成一个完整的页面. 下面直接上核心代码: 这里是WebView一些配置 WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); settings.setDomStorageEnabled(true); settings.setUseWideViewPort(true);

  • 详解Android WebView的input上传照片的兼容问题

    问题 前几天接到的一个需求,是关于第三方理财产品的H5上传照片问题. 对方说他们的新的需求,需要接入方配合上传资产照片的需求,测试之后发现我们这边的app端,IOS端上传没有问题,而Android端则点击没有任何反应. 对方H5调用的方式是通过<input type='file' accept='image/*'/>的方式调用,本来以为这个问题很简单,就是app端没有设置相机权限,造成的点击无反应情况,而实际上加了之后发现,并非简单的权限问题. 解决问题 因为Android的版本碎片问题,很多

  • Android 解决WebView调用loadData()方法显示乱码的问题

    Android 解决WebView调用loadData()方法显示乱码的问题 第一步: mWebView.getSettings().setDefaultTextEncodingName("UTF-8"); 第二步: mWebView.loadData(data, "text/html; charset=UTF-8", null); WebView常用配置: private void initWebView() { mWebView.getSettings().se

  • 详解Android Webview加载网页时发送HTTP头信息

    详解Android Webview加载网页时发送HTTP头信息 当你点击一个超链接进行跳转时,WebView会自动将当前地址作为Referer(引荐)发给服务器,因此很多服务器端程序通过是否包含referer来控制盗链,所以有些时候,直接输入一个网络地址,可能有问题,那么怎么解决盗链控制问题呢,其实在webview加载时加入一个referer就可以了,如何添加呢? 从Android 2.2 (也就是API 8)开始,WebView新增加了一个接口方法,就是为了便于我们加载网页时又想发送其他的HT

  • Android的WebView与H5前端JS代码交互的实例代码

    前段时间项目有深度和前端对接过,也是碰了一些坑,现在有时间就拿出来分享下 JS调用原生不外乎就两种,一种是传假的url,也就是url拦截的方式,类似于下面这种: //js代码 function sendCommand(param){ var url="js-call://"+param; document.location = url; } sendCommand("PlaySnake"); //Java代码 mWebView.setWebViewClient(ne

  • Android WebView 不支持 H5 input type="file" 解决方法

    最近因为赶项目进度,因此将本来要用原生控件实现的界面,自己做了H5并嵌入webview中.发现点击H5中 input type="file" 标签 不能打开android资源管理器. 通过网络搜索发现是因为 android webview 由于考虑安全原因屏蔽了 input type="file" 这个功能 . 经过不懈的努力,以及google 翻译的帮助 在 stackoverflow 中找到了解决的方法. 具体可以理解为 重写webview 的WebChrome

  • Android WebView的使用方法及与JS 相互调用

    Android WebView的使用方法及与JS 相互调用 1.添加网络权限 <uses-permission android:name="android.permission.INTERNET" /> 2.WebSettings 对访问页面进行设置. WebView mWebView = new WebView(this); WebSettings webSettings = mWebView .getSettings();//支持获取手势焦点,输入用户名.密码或其他 m

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

    效果图(1.3M) 一.前言 ** 戳这里可以去DEMO,来吧 ** 相信刚接触android不久的同志们,在面对产品提出的 : "自定义WebView页面中,长按文本的弹出选项.点击选择后,分享.转发.收藏选择文本" 这样的需求时,第一反应大部分是:这是系统行为,如果实现需要在web端实现. 但是web端实现的局限性太大,曾经也有过监听系统粘贴板,在用户点击复制的时候实现其他的逻辑,但是这样用户体验不好,所以自定义WebView中长按的弹出菜单,并在点击时返回选中文本的小控件闪亮登场

  • Android WebView实现长按保存图片及长按识别二维码功能

    先来简单说一下本文所要实现的功能:用户在浏览网页的时候,长按某一区域,识别如果是图片,则弹出弹框,出现保存图片的功能.同时识别图片是否是二维码,如果是则在弹框中追加识别二维码功能. 细节上:保存图片的弹框要显示在手指长按的位置:选择图片保存后,可以让用户直接去相册查看:选择识别二维码,判断是是不是网址,是的话可以让用户选择复制或访问,否则可以让用户选择复制或搜索. 然后再来看一下效果图: 保存图片 save.gif 识别包含普通文字的二维码: text.gif 识别包含网址的二维码: code.

  • Android加载长图的多种方案分享

    背景介绍 在某些特定场景下,我们需要考虑加载长图的需求,比如加载一幅<清明上河图>,这个好像有点过分了,那就加载1/2的<清明上河图>吧... 那TMD还不是一样道理. 言归正传说一下我这边遇到的情况,之前有图片或大图的模块是划分为H5来实现的,现在需求变更划分为原生开发,那么问题就来了. 图片尺寸为 图片大小为 这一刻我是懵逼的,哪个端图片上传的时候没限制尺寸和压缩?mdzz, 吐槽归吐槽,还是要撸起袖子解决加载长图大图的问题. 先提供几个技术方案来对比一下: 方案1:WebVi

  • Android开发实现长按返回键弹出关机框功能

    本文实例讲述了Android开发实现长按返回键弹出关机框功能.分享给大家供大家参考,具体如下: 今天刚好在PhoneWindowManager.java下看,当看到长按Home键的功能时,突然想到是不是可以长按back键来弹出关机框. 有想法就试试呗.当然想法是根据长按home键来的,那么我们应该可以模仿长按Home键来做.经过一番实验,貌似好像可以,拿出来给大家分享一下!!! 先找到PhoneWindowManager.java文件,在framework/base/policy/src/com

  • 微信小程序webview实现长按点击识别二维码功能示例

    本文实例讲述了微信小程序webview实现长按点击识别二维码功能.分享给大家供大家参考,具体如下: 场景:微信小程序,使用webview控件.需求:点击图片后长按图片出现"识别二维码" 1.JS代码: <script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script> <script type="text/javascript"> $(fu

  • android阅读器长按选择文字功能实现代码

    前言: 有时候我们需要实现长按选择文字功能,比如阅读器一般都有这个功能,有时候某个自定义控件上可能就有这种需求,如何实现呢?正好最近还算闲,想完善一下自己写的那个轻量级的txt文件阅读器(比如这个长按选择文字的功能就想加进去).于是花了两三天时间,实现了这个功能,效果还是不错的. 首先先看看效果图吧: 授人以鱼不如授人以渔,下面具体实现原理的教程. 1.实现原理 原理其实也不难,简单总结就是:绘制文字时把显示的文字的坐标记录下来(记录文字的左上右上左下右下四个点坐标),作用就是为了计算滑动范围.

  • Android MenuItem 自定义长按事件的实现

    会出现一个Toast来提示Menu的名字,比如下图的更多. 有的时候我们不需要这个Toast,或者说长按MenuItem的时候需要做一些其他的事情,该怎么办呢? 实现过程 首先我们先获取该MenuItem的View: View menu_more = findViewById(R.id.menu_more); 然后给它设置一个长按监听器: menu_more.setOnLongClickListener(new View.OnLongClickListener() { @Override pub

  • Android WebView开发之自定义WebView工具框

    附GitHub源码:WebViewExplore 先看图: 在WebView页面长按时会弹出一个复制框,但如果里面的item不是我们想要的或者想自定义,那么可以通过覆盖WebView的 startActionMode 方法来实现: /** * 长按弹出ActionMode菜单样式 * @param callback * @param type * @return */ @Override public ActionMode startActionMode(Callback callback, i

  • Android WebView开发之自定义WebView工具框

    附GitHub源码:WebViewExplore 先看图: 在WebView页面长按时会弹出一个复制框,但如果里面的item不是我们想要的或者想自定义,那么可以通过覆盖WebView的 startActionMode 方法来实现: /** * 长按弹出ActionMode菜单样式 * @param callback * @param type * @return */ @Override public ActionMode startActionMode(Callback callback, i

  • Android webview转PDF的方法示例

    1.网上找了好多没有显示出来效果不错,后来看到调用手机打印预览,看了效果还不错,就打算使用系统打印服务预览下载 2.'webView.createPrintDocumentAdapter()'得到打印的PrintDocumentAdapter有了该类就可以使用onWrite方法写入制定的文件,但是这个方法需要传入回调这个悲剧的是这个回调方法是hiden的我们没办法调用 3,字怎么解决呢,有连个方法 3.1 使用此开源库替换自己的sdk 中的android.jar文件,就可以使用了 https:/

随机推荐