自定义ActionMode Menu

ActionMode 是啥?

Represents a contextual mode of the user interface. Action modes can be used to provide alternative interaction modes and replace parts of the normal UI until finished. Examples of good action modes include text selection and contextual actions.

这是来自官方的解释。简单来说,其实就是在用户界面提供一个action的菜单,辅助ui完成操作。
最常见ActionMode是这个样子的:


好看的ActionMode是这个样子的:


  • 普通的ActionMode
private ActionMode mActionMode;
private ActionMode.Callback mCallback;
private boolean isInActionMode;
public void startActionMode() {
    if (mCallback == null) {
        mCallback = new ActionMode.Callback() {
        @Override
         public boolean onCreateActionMode(ActionMode mode, Menu menu) {
             // 引入新的menu
             mode.getMenuInflater().inflate(R.menu.action_menu,menu);
             return true;
          }
         @Override
          public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
          return false;
          }
         @Override
          public boolean onActionItemClicked(ActionMode mode,
MenuItem item) {
              switch (item.getItemId()) {
                  case R.id.action1:
                      // do your things
                     break;
              }
              return true;
         }
        @Override
         public void onDestroyActionMode(ActionMode mode) {
              isInActionMode = false;
         }
     };
   }
   mActionMode = startActionMode(mCallback);
   isInActionMode = true;
}
  • WebView 中ActionMode
    在WebView中自定义menu 会麻烦一些,按照上面的思路,我们应该去覆写WebView的startActionMode方法,像这样:
@Override
public ActionMode startActionMode(ActionMode.Callback callback) {
    ViewParent parent = getParent();
     if (parent == null) {
         return null;
     }
     return parent.startActionModeForChild(this,
                         new CustomActionModeCallback());
}

这样在6.0以前是ok的。但是6.0以后WebView的ActionMode menu样式终于做成和ios一样的悬浮菜单了,亲测上面的方法是没有显示我们自定义的callback的。
不得不另寻它法,最后发现一个规律是:调用View.startActionMode(callback) 都会走Activity的onActionModeStarted(ActionMode mode)方法,所以我们可以来这里自定义:

@Override
public void onActionModeStarted(ActionMode mode) {
    if (mActionMode == null) {
        mActionMode = mode;
        Menu menu = mode.getMenu();
        menu.clear();
        getMenuInflater().inflate(R.menu.YOUR_MENU, menu);
        List menuItems = new ArrayList<>();
       // get custom menu item
       for (int i = 0; i < menu.size(); i++) {
           menuItems.add(menu.getItem(i));
       }
       menu.clear();
       // reset menu item
       int size = menuItems.size();
       for (int i = 0; i < size; i++) {
           addMenuItem(menu, menuItems.get(i), i, true);
       }
       super.onActionModeStarted(mode);
     }
}

记得在onActionModeFinished****(ActionMode mode)清理掉我们自己的ActionMode

public void onActionModeFinished(ActionMode mode) {
        super.onActionModeFinished(mode);
        mActionMode = null;
}

这样就可以替换掉WebView自带的ActionMode Menu,改成我们自己的。

昨晚俺在知乎专栏撸的,搬运到简书。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,921评论 0 17
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,358评论 0 33
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,641评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,192评论 19 139
  • 1、不安全的随机数生成,在CSRF TOKEN生成、password reset token生成等,会造成toke...
    nightmare丿阅读 9,308评论 0 1

友情链接更多精彩内容