Android菜單簡析02(ContextMenu),androidcontextmenu

來源:互聯網
上載者:User

Android菜單簡析02(ContextMenu),androidcontextmenu

在上一篇文章 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 檔案


<menu xmlns:android="http://schemas.android.com/apk/res/android" ><item    android:id="@+id/action_share"    android:orderInCategory="0"    android:showAsAction="ifRoom"    android:icon="@android:drawable/ic_menu_share"    android:title="share"/><item    android:id="@+id/action_save"    android:orderInCategory="1"    android:showAsAction="ifRoom"    android:icon="@android:drawable/ic_menu_save"    android:title="save"/><item    android:id="@+id/action_search"    android:orderInCategory="2"    android:showAsAction="ifRoom"    android:icon="@android:drawable/ic_menu_search"    android:title="search"/><item    android:id="@+id/action_delete"    android:orderInCategory="4"    android:showAsAction="ifRoom"    android:icon="@android:drawable/ic_menu_delete"    android:title="delectAction"/> <item    android:id="@+id/action_edit"    android:orderInCategory="5"    android:showAsAction="ifRoom"    android:icon="@android:drawable/ic_menu_edit"    android:title="edit"/>   <item    android:id="@+id/action_help"    android:orderInCategory="6"    android:showAsAction="ifRoom"    android:icon="@android:drawable/ic_menu_help"    android:title="help"/>      <item    android:id="@+id/action_compass"    android:orderInCategory="6"    android:showAsAction="ifRoom"    android:icon="@android:drawable/ic_menu_compass"    android:title="compass"/></menu>


同時 ,動作模式還可以和 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. 設定菜單監聽事件

具體的代碼過程

@Overridepublic 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);}@Overridepublic 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 相關的其他幾個方法



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



這幾個方法可以根據自己的需求,選擇性實現。

ContextMenu 的相關知識就給大家介紹到這裡,有什麼問題歡迎大家交流。

下一篇給大家介紹 PopMenu 的相關知識






在android中,當我按了listview中的一個子項時,利用ContextMenu快顯功能表,那怎擷取這個子項的資料?

不要這樣拿 我一般這麼拿
listview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
@SuppressWarnings("unchecked")
HashMap<String, Object> map = (HashMap<String, Object>) arg0
.getItemAtPosition(arg2);
這個map就是你點擊的那項的資料
 
Android開發 registerForContextMenu怎區分長按不同Item展現的菜單?

有個ID的啊
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.