ActionMode是android3.0之后出现的一种菜单选择模式
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和ToolBar一块使用的时候,心情就不是那么的愉快了...,我们会看到下面的效果
Toolbar被挤压下去了,是不是感觉安卓太坑了...
不用着急,我们还是有解决办法滴,我们要确保几件事情:
(1)我们的Activity继承AppCompatActivity
(2)设置主题,保证我们的ActionMode显示在Toolbar上面
- true
此外我们可以在主题当中设置我们的ActionMode的样式(高度,背景颜色,logo等)
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