一、背景
某些情况下,我们希望能够自定义WebView的长按菜单功能,但网络上各种文档都不是很准确或是兼容性不好,经过综合探索,整理出WebView自定义长按菜单的技术方案。
二、技术原理概述
突破口是三点:
1、拦截WebView中的startActionMode
2、自定义ActionMode.Callback2
3、菜单选项的隐藏与显示
三、代码实现
public class CustomActionWebView extends WebView {
private static final String CUSTOM_MENU_JS_INTERFACE = "CustomMenuJSInterface";
private ActionMode mActionMode;
private ActionSelectListener mActionSelectListener;
private List<String> mCustomMenuList; //自定义添加的选项
private List<String> mStayMenuList; //需要保留的系统选项
public CustomActionWebView(Context context) {
super(context);
init();
}
public CustomActionWebView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CustomActionWebView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
addJavascriptInterface(new ActionSelectInterface(this), CUSTOM_MENU_JS_INTERFACE);
mStayMenuList = new ArrayList<>();
mStayMenuList.add("复制");
mStayMenuList.add("全选");
mStayMenuList.add("分享");
mStayMenuList.add(getResources().getString(R.string.menu_test));
mCustomMenuList = new ArrayList<>();
mCustomMenuList.add("菜单1");
mCustomMenuList.add("菜单2");
}
@Override
public ActionMode startActionMode(ActionMode.Callback callback) {
return super.startActionMode(buildCustomCallback(callback));
}
@Override
public ActionMode startActionMode(ActionMode.Callback callback, int type) {
return super.startActionMode(buildCustomCallback(callback), type);
}