[转]WebView长按弹出复制粘贴

ActionMode简介

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

ActionMode的创建

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

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();
            }
        }
    };

然后

通过startActionMode(mCallback);方法调用就可以了,就是这么简单

ActionMode遇到的坑

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

Toolbar被挤压下去了,是不是感觉安卓太坑了...

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

(1)我们的Activity继承AppCompatActivity

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

<item name="windowActionModeOverlay">true</item>
此外我们可以在主题当中设置我们的ActionMode的样式(高度,背景颜色,logo等)
<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


---------------------
作者:彼岸人生
来源:CSDN
原文:https://blog.csdn.net/kemeng7758/article/details/77869113?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
版权声明:本文为作者原创文章,转载请附上博文链接! 

发布了113 篇原创文章 · 获赞 69 · 访问量 30万+

猜你喜欢

转载自blog.csdn.net/admans/article/details/104791579