Android菜單簡析02(ContextMenu),androidcontextmenu
在上一篇文章 Android 菜單簡析01(OptionsMenu) 中給大家介紹了OptionsMenu 的使用,這篇接著給大家介紹下ContextMenu 的用法。
ContextMenu 簡稱操作功能表,通過長按事件響應,有兩種響應模式
- 浮動模式
效果類似彈出的 Dialog,在螢幕的正中央,可以自訂顯示的 Menu 以及 MenuItem 的響應
- 動作模式
通過ActionBar 實現,效果實在 Title 的地方,出現動作條。
特別注意
ContextMenu 的 動作模式 在 Android 3.0 之前的版本無法實現(動作模式需要 ActionBar支援),如果應用 SherlockActionBar 是否支援暫時沒有驗證。
先看下 動作模式 的
坑爹的 csdn 上傳不了圖片
第一張圖:長按之後的顯示效果,App 的 title 變為 ActionMode ,會看到我們的 MenuItem 只有表徵圖,沒有文字。
第二張圖:點擊更多之後,沒有顯示的 MenuItem ,只有文字,沒有表徵圖。
再看下 ContextMenu 的 浮動模式
坑爹的 csdn 上傳不了圖片
長按 Btn ,就彈出的介面,點擊 MenuItem 或者菜單之外的地區,菜單消失。
在低版本上,Android 3.0 之前,ContextMenu 的浮動效果一致,都是如所示,使用方法也一樣。
現在看下如何建立 ContextMenu ,以及調用的方法。
一、動作模式
ContextMenu 的動作模式建立過程
- 註冊動作模式
// 給 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 } });
二、浮動模式
- 建立菜單
- 設定菜單監聽事件
具體的代碼過程
@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的啊