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

作者:红日666 时间:2023-01-12 13:41:43 

附GitHub源码:WebViewExplore

先看图:

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

在WebView页面长按时会弹出一个复制框,但如果里面的item不是我们想要的或者想自定义,那么可以通过覆盖WebView的 startActionMode 方法来实现:


   /**
    * 长按弹出ActionMode菜单样式
    * @param callback
    * @param type
    * @return
    */
   @Override
   public ActionMode startActionMode(Callback callback, int type) {
       Logger.d(TAG, "startActionMode--callback:" + callback + " type:" + type);
       ActionMode actionMode = super.startActionMode(callback, type);
       return resolveActionMode(actionMode);
   }

   private ActionMode resolveActionMode(ActionMode actionMode) {
       if (actionMode != null) {
           final Menu menu = actionMode.getMenu();
           mActionMode = actionMode;
           //清除系统自定item选项
           menu.clear();

/**
            * 为菜单item重新赋值
            */
           for (int i = 0; i < mActionList.size(); i++) {
               menu.add(mActionList.get(i));
               //可以为每个item添加icon
               //menu.getItem(i).setIcon(R.drawable.ic_launcher);
           }

for (int i = 0; i < menu.size(); i++) {
               MenuItem menuItem = menu.getItem(i);
               /**
                * 新添item的点击事件【可根据不同个item点击事件,来进行相关的业务处理】
                */
               menuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() {
                   @Override
                   public boolean onMenuItemClick(MenuItem item) {
                       Logger.d(TAG, item.getTitle().toString());
                       getSelectedData((String) item.getTitle());
                       releaseAction();
                       return true;
                   }
               });
           }
       }

mActionMode = actionMode;
       return actionMode;
   }

上面的mActionList是早已经在该控件的构造方法调用时添加了所需的item:


   private void initData() {
       mActionList = new ArrayList<>();
       //扩选
       mActionList.add(GlobalConstant.ENLARGE);
       //复制
       mActionList.add(GlobalConstant.COPY);
       //分享
       mActionList.add(GlobalConstant.SHARE);
   }

这里拿"复制"事件举例,通过如下native调用该Js的代码的方式可以获取当前所文本框所选中的文本:


   /**
    * Android调用JS的代码方式有2种:
    * 1、通过WebView的loadUrl()
    * 2、通过WebView的evaluateJavaScript()
    * <p>
    * 点击的时候,获取网页中选择的文本,回掉到原生中的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, new ValueCallback<String>() {
               @Override
               public void onReceiveValue(String value) {
                   //此处为js返回结果
                   Logger.d(TAG, "value:" + value);
               }
           });
       } else {
           loadUrl("javascript:" + js);
       }
   }

点击复制按钮就可以将我们选中的文本赋值到上述js脚本中的 'txt' 变量中,但是如何传递到native呢,这就用到了 WebView与Native的交互 章节介绍的JS调用Native的方法1,这里再说明一下:

在该控件的构造方法中早已映射了原生方法接口:


   private void linkJSInterface() {
       //Js调用native的方式一
       addJavascriptInterface(new ActionSelectInterface(this), "JSInterface");
   }

JSInterface 对应的映射接口 ActionSelectInterface 实现如下:


   /**
    * JS调用android原生方法1:
    * 通过WebView的addJavascriptInterface()进行对象映射
    */
   public class ActionSelectInterface {

private ActionWebView mActionWebView;

public ActionSelectInterface(ActionWebView actionWebView) {
           mActionWebView = actionWebView;
       }

@JavascriptInterface
       public void callback(final String value, final String title) {
           Logger.d(TAG, "currentThread:" + Thread.currentThread());
           post(new Runnable() {
               @Override
               public void run() {
                   if (mActionSelectListener != null) {
                       mActionSelectListener.onClick(title, value);
                   }
               }
           });
       }
   }

所以最终就可以根据上述js脚本中的 'JSInterface.callback(txt,title);‘方法的调用,来最终响应 至native类ActionSelectInterface中callback中,会收到title及复制文本value的值。

这样根据之前的监听,便可进行后续的一系列业务操作。 

来源:https://blog.csdn.net/u012440207/article/details/121804509

标签:Android,WebView,工具框
0
投稿

猜你喜欢

  • SpringBoot项目中如何访问HTML页面

    2021-08-09 11:19:07
  • C#排序算法之快速排序解析

    2023-03-21 00:39:28
  • C#实现串口调试工具

    2022-06-09 12:04:04
  • android判断手机是否安装地图应用实现跳转到该地图应用

    2022-11-30 11:01:45
  • Android手机卫士之设置密码对话框

    2021-08-03 07:24:27
  • Android DownloadMananger管理器实现下载图片功能

    2022-05-06 03:20:24
  • C#调用百度翻译实现翻译HALCON的示例

    2022-06-08 23:33:50
  • C#图像亮度调式与伪彩色图的处理教程(推荐)

    2022-03-26 19:43:54
  • 详解Java中的日期类

    2022-08-27 17:14:03
  • C# 抓取网页内容的方法

    2022-09-13 04:50:10
  • 保证缓存和数据库的数据一致性详解

    2023-11-18 08:10:44
  • 解决SpringBoot web项目启动后立即关闭的问题

    2023-07-26 02:33:37
  • 如何修改FeginCilent定义的服务名到指定服务

    2022-07-05 05:49:05
  • Java访问Hadoop分布式文件系统HDFS的配置说明

    2021-11-20 05:53:42
  • JavaWeb 中Cookie实现记住密码的功能示例

    2023-04-06 05:06:48
  • Java Set集合及其子类HashSet与LinkedHashSet详解

    2023-11-26 11:39:35
  • 用java开发dota英雄最华丽的技能(实例讲解)

    2022-05-27 00:10:20
  • java去除字符串中的空格、回车、换行符、制表符的小例子

    2022-04-13 12:33:44
  • DUCC配置平台实现一个动态化线程池示例代码

    2023-11-28 12:07:39
  • Android Studio实现简单音乐播放功能的示例代码

    2021-09-14 19:51:45
  • asp之家 软件编程 m.aspxhome.com