自定義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的。
不得不另尋它法,最后發(fā)現(xiàn)一個規(guī)律是:調(diào)用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,改成我們自己的。

昨晚俺在知乎專欄擼的,搬運到簡書。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,497評論 0 17
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗。 張土汪:刷leetcod...
    土汪閱讀 12,766評論 0 33
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,739評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • 1、不安全的隨機數(shù)生成,在CSRF TOKEN生成、password reset token生成等,會造成toke...
    nightmare丿閱讀 3,732評論 0 1