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

附GitHub源码:WebViewExplore

先看图:

在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的值。

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

到此这篇关于Android WebView开发之自定义WebView工具框的文章就介绍到这了,更多相关Android WebView 自定义工具框内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android使用WebView实现离线阅读功能

    1.先看效果图,加载动画: 加载完成,注意当前为飞行模式! 2.使用 1).让你的javabean实现OffLineLevelItem接口,因为我的这个离线阅读支持多级下载,比如Demo中的每个频道下面的第一页item都可以缓存. package com.zgh.offlinereader; import java.util.List; public interface OffLineLevelItem { //是否有下一级 boolean haveNextLevel(); //内容url St

  • Android 中 WebView 的基本用法详解

    加载 URL (网络或者本地 assets 文件夹下的 html 文件) 加载 html 代码 Native 和 JavaScript 相互调用 加载网络 URL webview.loadUrl(https://www.baidu.com/); 加载 assets 下的 html 文件 webview.loadUrl(file:///android_asset/test.html); 加载 html 代码 // 两个代码差不多 // 偶尔出现乱码 webview.loadData(); // 比

  • Android webView字体突然变小的原因及解决

    背景 最近,端内在做 webView 统一的时候,个性签名中的 WebView 替换为 CustomWebView 之后,发现字体突然变小. 一开始不知道是什么原因,通过二分法查找最近的提交,排查之后,发现是 SignatureWebView 的继承关系从 WebView 修改为 CustomWebView.revert 之后就正常了. 于是,我问自己,为什么会这样呢? 原因分析 我们知道,WebViewSetting 里面是可以修改 WebView 的一些默认设置的. 阅读官方文档,发现 se

  • Android 解决WebView多进程崩溃的方法

    问题 在android 9.0系统上如果多个进程使用WebView需要使用官方提供的api在子进程中给webview的数据文件夹设置后缀: WebView.setDataDirectorySuffix(suffix); 否则将会报出以下错误: Using WebView from more than one process at once with the same data directory is not supported. https://crbug.com/558377 1 com.a

  • Android webView如何输出自定义网页

    这次来使用webview输出网页型数据.因为这样的数据好使用富文本编辑器,有各种各样的拓展. 上代码: package controller.hzl.com.testcall; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.webkit.WebView; import android.webkit.We

  • 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程序开发之自定义设置TabHost,TabWidget样式

    先看效果: 京东商城底部菜单栏 新浪微博底部菜单栏 本次学习效果图: 第一,主布局文件(启动页main.xml,位于res/layout目录下)代码 <?xml version="." encoding="utf-"?> <TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_paren

  • Android超详细介绍自定义多选框与点击按钮跳转界面的实现

    总程:在avtivity_main.xml设计5个控件,btn1-5,点击btn1弹出一个多选对话框,点击按钮btn1弹出一个多选框可选择你喜欢的打野英雄,点击btn2跳转到activity_main2界面(就是图片,不可选择)设计思路流程:在activity_main.xml布局界面,总体在头目录进行垂直排列,然后镶嵌5个水平的线性布局(左是ImageView,右边是Button按钮)由于5张图的大小在一个屏幕显示不出来,所以添加一个ScoveView滚动,以使所有资源可以看到! 在MainA

  • Android混合开发教程之WebView的使用方法总结

    前言: 今天修改项目中一个有关WebView使用的bug,激起了我总结WebView的动机,今天抽空做个总结. 简介 WebView是一个基于webkit引擎.展现web页面的控件. Android的Webview在低版本和高版本采用了不同的webkit版本内核,4.4后直接使用了Chrome. 作用 显示和渲染Web页面 直接使用html文件(网络上或本地assets中)作布局 可和JavaScript交互调用 WebView控件功能强大,除了具有一般View的属性和设置外,还可以对url请求

  • Android应用开发中自定义ViewGroup的究极攻略

    支持margin,gravity以及水平,垂直排列 最近在学习android的view部分,于是动手实现了一个类似ViewPager的可上下或者左右拖动的ViewGroup,中间遇到了一些问题(例如touchEvent在onInterceptTouchEvent和onTouchEvent之间的传递流程),现在将我的实现过程记录下来. 首先,要实现一个ViewGroup,必须至少重写onLayout()方法(当然还有构造方法啦:)).onLayout()主要是用来安排子View在我们这个ViewG

  • Android App开发中自定义View和ViewGroup的实例教程

    View Android所有的控件都是View或者View的子类,它其实表示的就是屏幕上的一块矩形区域,用一个Rect来表示,left,top表示View相对于它的parent View的起点,width,height表示View自己的宽高,通过这4个字段就能确定View在屏幕上的位置,确定位置后就可以开始绘制View的内容了. View绘制过程 View的绘制可以分为下面三个过程: Measure View会先做一次测量,算出自己需要占用多大的面积.View的Measure过程给我们暴露了一个

  • Android应用开发中自定义ViewGroup视图容器的教程

    一.概述 在写代码之前,我必须得问几个问题: 1.ViewGroup的职责是啥? ViewGroup相当于一个放置View的容器,并且我们在写布局xml的时候,会告诉容器(凡是以layout为开头的属性,都是为用于告诉容器的),我们的宽度(layout_width).高度(layout_height).对齐方式(layout_gravity)等:当然还有margin等:于是乎,ViewGroup的职能为:给childView计算出建议的宽和高和测量模式 :决定childView的位置:为什么只是

  • Android自定义 WebView浏览器

    WebView是Android中一个非常实用的组件,它和Safai.Chrome一样都是基于Webkit网页渲染引擎,可以通过加载HTML数据的方式便捷地展现软件的界面. 在布局文件中添加<EditText/>和<Button/>控件, 在布局文件中添加<WebView/>控件 在Activity中获取WebView对象 调用WebView对象的loadUrl()方法,参数:String路径 添加访问网络的权限android.permission.INTERNET 调用

  • Android应用开发中WebView的常用方法笔记整理

    基本使用 使用WebView通常是需要网络的,所以需要加上访问网络的权限 <uses-permission android:name="android.permission.INTERNET" /> 1.加载某个url的方法 WebView.loadUrl("http://www.baidu.com"); 需要注意的是不要省略前面的http://,省略的话,某些ROM中的WebView会加载失败 2.加载assets中的HTML WebView.load

随机推荐