Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android菜單簡析02(ContextMenu)

Android菜單簡析02(ContextMenu)

編輯:關於Android編程

在上一篇文章 Android 菜單簡析01(OptionsMenu) 中給大家介紹了OptionsMenu 的使用,這篇接著給大家介紹下ContextMenu 的用法。

ContextMenu 簡稱上下文菜單,通過長按事件響應,有兩種響應模式

  1. 浮動模式
    效果類似彈出的 Dialog,在屏幕的正中央,可以自定義顯示的 Menu 以及 MenuItem 的響應
  2. 動作模式
    通過ActionBar 實現,效果實在 Title 的地方,出現動作條。

    特別注意

    ContextMenu 的 動作模式 在 Android 3.0 之前的版本無法實現(動作模式需要 ActionBar支持),如果應用 SherlockActionBar 是否支持暫時沒有驗證。

    先看下 動作模式 的效果圖

     

    坑爹的 csdn 上傳不了圖片

     

     

    第一張圖:長按之後的顯示效果,App 的 title 變為 ActionMode ,會看到我們的 MenuItem 只有圖標,沒有文字。

    第二張圖:點擊更多之後,沒有顯示的 MenuItem ,只有文字,沒有圖標。

    再看下 ContextMenu 的 浮動模式 效果圖

     

    坑爹的 csdn 上傳不了圖片

     

     

    長按 Btn ,就彈出上圖的界面,點擊 MenuItem 或者菜單之外的區域,菜單消失。

    在低版本上,Android 3.0 之前,ContextMenu 的浮動效果一致,都是如上圖所示,使用方法也一樣。

    現在看下如何創建 ContextMenu ,以及調用的方法。

     

    一、動作模式

     

    ContextMenu 的動作模式創建過程

    1. 注冊動作模式
       // 給 Btn 注冊動作模式
       registerForContextMenu(btnView);
      
       // 響應長按事件
       btn.setOnLongClickListener(new OnLongClickListener() {
      
           @Override
           public boolean onLongClick(View v) {
               v.setSelected(true);
      
               ContextMenu.this.startActionMode(mActionMode);
               return true;
           }
       });

      2. 實現動作模式回調接口

       

       

       /**
       *
       *創建回調接口
       *
       */
       private ActionMode.Callback mActionMode = new ActionMode.Callback() {
      
       @Override
       public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
           // TODO Auto-generated method stub
           return false;
       }
      
       @Override
       public void onDestroyActionMode(ActionMode mode) {
           // TODO Auto-generated method stub
           if (mode != null) {
               mode = null;
           }
      
       }
      
       @Override
       public boolean onCreateActionMode(ActionMode mode, Menu menu) {
           MenuInflater inflater = getMenuInflater();
           // 添加菜單文件
           inflater.inflate(R.menu.main_icon, menu);
      
           return true;
       }
      
       @Override
       public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
           switch (item.getItemId()) {
           case R.id.action_share:
               Log.d(tag, action_share);
               Toast.makeText(getApplicationContext(), action_share, Toast.LENGTH_SHORT).show();
               mode.finish();
               break;
           case R.id.action_save:
               Log.d(tag, action_save);
               Toast.makeText(getApplicationContext(), action_save, Toast.LENGTH_SHORT).show();
               mode.finish();
               break;
           case R.id.action_settings:
               Log.d(tag, action_settings);
               Toast.makeText(getApplicationContext(), action_settings, Toast.LENGTH_SHORT).show();
               mode.finish();
               break;
           case R.id.action_delete:
               Log.d(tag, action_delete);
               Toast.makeText(getApplicationContext(), action_delete, Toast.LENGTH_SHORT).show();
               mode.finish();
               break;
           case R.id.action_edit:
               Log.d(tag, action_edit);
               Toast.makeText(getApplicationContext(), action_edit, Toast.LENGTH_SHORT).show();
               mode.finish();
               break;
           default:
               break;
           }
      
           return true;
       }
       };


       

      3 .取消注冊動作模式

       //取消注冊
       unRegisterForContextMenu(btnView);

       

      Menu 菜單的 XML 文件

       

       

      
      
      	       
      

       

       

      同時 ,動作模式還可以和 ListView 和 GridView 結合

      長按 ListView Item 有如下的效果

       

      坑爹的 CSDN 上傳不了圖

       

       

      具體代碼實現


       

          listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
          listView.setMultiChoiceModeListener(new MultiChoiceModeListener() {
              @Override
              public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                  // TODO Auto-generated method stub
                  return false;
              }
      
              @Override
              public void onDestroyActionMode(ActionMode mode) {
                  // TODO Auto-generated method stub
      
              }
      
              @Override
              public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                  MenuInflater inflater = getMenuInflater();
                  inflater.inflate(R.menu.main_icon, menu);
                  return true;
              }
      
              @Override
              public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                  switch (item.getItemId()) {
                  case R.id.action_share:
                      Log.d(tag, action_share);
                      // 修改title
                      mode.setTitle(action_share);
                      Toast.makeText(getApplicationContext(), action_share, Toast.LENGTH_SHORT).show();
                  mode.finish();
                      break;
                  case R.id.action_save:
                      Log.d(tag, action_save);
                      Toast.makeText(getApplicationContext(), action_save, Toast.LENGTH_SHORT).show();
                      mode.finish();
                      break;
                  default:
                      break;
                  }
      
                  return true;
      
      
              }
      
              @Override
              public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
                  // TODO Auto-generated method stub
      
              }
          });


       

       

      二、浮動模式

      1. 創建菜單
      2. 設置菜單監聽事件

        具體的代碼過程

        @Override
        public void onCreateContextMenu(android.view.ContextMenu menu, View v, ContextMenuInfo menuInfo) {
            MenuInflater inflater = getMenuInflater();
        
            inflater.inflate(R.menu.main_icon, menu);
            super.onCreateContextMenu(menu, v, menuInfo);
        }
        
        @Override
        public boolean onContextItemSelected(MenuItem item) {
            // 監聽事件只做了部分響應
        
            switch (item.getItemId()) {
            case R.id.action_compass:
        
                break;
            case R.id.action_delete:
                break;
        
            default:
                break;
            }
        
        
            return super.onContextItemSelected(item);
        }
        

        Menu 的 XML 文件與 動作模式相同

        雖然 Menu 菜單有圖標,但是 ContextMenu 不支持圖標,這個官網有說明。

        這樣就完成了基本的 ContextMenu 浮動模式的菜單。

        與 ContextMenu 相關的其他幾個方法

         

         

         

        /**
        *
        *打開菜單
        *
        *
        */
        @Override
        public void openContextMenu(View view) {
            // TODO Auto-generated method stub
            super.openContextMenu(view);
        }
        
        /**
        *
        *關閉菜單
        *
        *
        */
        
        @Override
        public void closeContextMenu() {
            // TODO Auto-generated method stub
            super.closeContextMenu();
        }
        
        /**
        *
        *關閉菜單之後的監聽事件
        *
        *
        */
        
        @Override
        public void onContextMenuClosed(Menu menu) {
            super.onContextMenuClosed(menu);
        }


         


         

         



         

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved