ActionMode是android3.0以后出现的一种菜单选择模式javascript
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和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>
ActionMode在webview上面,Android6.0以前和以后发生了一些变化,6.0以后的更加友好
Android6.0以前的样式就是咱们上图那幅图片所展现的
继承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页面的文本信息,须要使用到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