WebView长按弹出复制粘贴

ActionMode简介

ActionMode是android3.0以后出现的一种菜单选择模式javascript

ActionMode的建立

ActionMode的使用特别的简单,主要用到两个方法,startActionMode和ActionMode.Callback(),startActionMode:开启咱们的菜单,ActionMode.Callback方法中主要有四个方法,详情和介绍看下面的代码:html

ActionMode.Callback mCallback=new ActionMode.Callback(){

        /**
         * 建立菜单的样式,返回true说明建立成功
         * @param actionMode
         * @param menu
         * @return
         */
        @Override
        public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
            MenuInflater menuInflater = actionMode.getMenuInflater();
            menuInflater.inflate(R.menu.action_mode,menu);
            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
            return false;
        }

        /**
         * 当ActionMode的条目被点击的时候,调用这个方法
         * @param actionMode
         * @param menuItem
         * @return
         */
        @Override
        public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
            return false;
        }

        /**
         * 当ActionMode被销毁的时候调用
         * @param actionMode
         */
        @Override
        public void onDestroyActionMode(ActionMode actionMode) {
            if(actionMode!=null){
                actionMode.finish();
            }
        }
    };

而后java


经过startActionMode(mCallback);方法调用就能够了,就是这么简单android

ActionMode遇到的坑

当ActionMode和ToolBar一块使用的时候,心情就不是那么的愉快了...,咱们会看到下面的效果web


Toolbar被挤压下去了,是否是感受安卓太坑了...ide


不用着急,咱们仍是有解决办法滴,咱们要确保几件事情:ui

(1)咱们的Activity继承AppCompatActivitythis

(2)设置主题,保证咱们的ActionMode显示在Toolbar上面lua

<item name="windowActionModeOverlay">true</item>

此外咱们能够在主题当中设置咱们的ActionMode的样式(高度,背景颜色,logo等)spa

<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对象,而后对此进行一些处理就能够了,直接上代码

@Override
    public ActionMode startActionMode(ActionMode.Callback callback) {
        ActionMode actionMode = super.startActionMode(callback);
        return resolveMode(actionMode);
    }

    @Override
    public 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() {
                    @Override
                    public 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