android menu菜單的動態隱藏
今天開始研究ADW的Launcher了,加油加油···先從ADW主界麵按menu按鍵開始,涉及以下3個方法:
1、onCreateOptionsMenu(Menu menu)
2、onPrepareOptionsMenu(Menu menu)
3、onOptionsItemSelected(MenuItem item)
分別解釋一下:
方法名 | 觸發時間 | 如何更新 |
onCreateOptionsMenu | 進入Launcher後第一次點MENU按鈕時觸發 | 1、切換語言,android在選擇不同的語言之後會調用IActivityManager的實例updateConfiguration。2、kill掉ADW的Launcher也行。 |
onPrepareOptionsMenu | 有兩種情況:1、進入Launcher後第一次點MENU按鈕觸發onCreateOptionsMenu後調用;2、經過第一步,以後每次點MENU按鈕時都會觸發 | 點擊MENU觸發 |
onOptionsItemSelected | 選擇MENU裏麵的任意內容後觸發 | 點擊NEMU裏的任意選項 |
三段代碼如下:
onCreateOptionsMenu(Menu menu)
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- if (mDesktopLocked && mSavedInstanceState == null) return false;
- super.onCreateOptionsMenu(menu);
- menu.add(MENU_GROUP_ADD, MENU_ADD, 0, R.string.menu_add)
- .setIcon(android.R.drawable.ic_menu_add)
- .setAlphabeticShortcut('A');
- menu.add(MENU_GROUP_NORMAL, MENU_WALLPAPER_SETTINGS, 0, R.string.menu_wallpaper)
- .setIcon(android.R.drawable.ic_menu_gallery)
- .setAlphabeticShortcut('W');
- menu.add(MENU_GROUP_NORMAL, MENU_SEARCH, 0, R.string.menu_search)
- .setIcon(android.R.drawable.ic_search_category_default)
- .setAlphabeticShortcut(SearchManager.MENU_KEY);
- menu.add(MENU_GROUP_NORMAL, MENU_NOTIFICATIONS, 0, R.string.menu_edit)
- .setIcon(android.R.drawable.ic_menu_edit)
- .setAlphabeticShortcut('E');
- final Intent settings = new Intent(android.provider.Settings.ACTION_SETTINGS);
- settings.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
- Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
- menu.add(MENU_GROUP_NORMAL, MENU_SETTINGS, 0, R.string.menu_settings)
- .setIcon(android.R.drawable.ic_menu_preferences).setAlphabeticShortcut('P')
- .setIntent(settings);
- //ADW: add custom settings
- menu.add(MENU_GROUP_NORMAL, MENU_ALMOSTNEXUS, 0, R.string.menu_adw_settings)
- .setIcon(android.R.drawable.ic_menu_preferences)
- .setAlphabeticShortcut('X');
- menu.add(MENU_GROUP_CATALOGUE, MENU_APP_GRP_CONFIG, 0, R.string.AppGroupConfig)
- .setIcon(android.R.drawable.ic_menu_agenda);
- //menu.add(MENU_GROUP_CATALOGUE, MENU_APP_GRP_RENAME, 0, R.string.AppGroupRename)
- // .setIcon(R.drawable.ic_menu_notifications);
- menu.add(MENU_GROUP_CATALOGUE, MENU_APP_SWITCH_GRP, 0, R.string.AppGroupChoose)
- .setIcon(android.R.drawable.ic_menu_manage);
- menu.add(MENU_GROUP_CATALOGUE, MENU_APP_DELETE_GRP, 0, R.string.AppGroupDel)
- .setIcon(android.R.drawable.ic_menu_delete);
- return true;
- }
@Override public boolean onCreateOptionsMenu(Menu menu) { if (mDesktopLocked && mSavedInstanceState == null) return false; super.onCreateOptionsMenu(menu); menu.add(MENU_GROUP_ADD, MENU_ADD, 0, R.string.menu_add) .setIcon(android.R.drawable.ic_menu_add) .setAlphabeticShortcut('A'); menu.add(MENU_GROUP_NORMAL, MENU_WALLPAPER_SETTINGS, 0, R.string.menu_wallpaper) .setIcon(android.R.drawable.ic_menu_gallery) .setAlphabeticShortcut('W'); menu.add(MENU_GROUP_NORMAL, MENU_SEARCH, 0, R.string.menu_search) .setIcon(android.R.drawable.ic_search_category_default) .setAlphabeticShortcut(SearchManager.MENU_KEY); menu.add(MENU_GROUP_NORMAL, MENU_NOTIFICATIONS, 0, R.string.menu_edit) .setIcon(android.R.drawable.ic_menu_edit) .setAlphabeticShortcut('E'); final Intent settings = new Intent(android.provider.Settings.ACTION_SETTINGS); settings.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); menu.add(MENU_GROUP_NORMAL, MENU_SETTINGS, 0, R.string.menu_settings) .setIcon(android.R.drawable.ic_menu_preferences).setAlphabeticShortcut('P') .setIntent(settings); //ADW: add custom settings menu.add(MENU_GROUP_NORMAL, MENU_ALMOSTNEXUS, 0, R.string.menu_adw_settings) .setIcon(android.R.drawable.ic_menu_preferences) .setAlphabeticShortcut('X'); menu.add(MENU_GROUP_CATALOGUE, MENU_APP_GRP_CONFIG, 0, R.string.AppGroupConfig) .setIcon(android.R.drawable.ic_menu_agenda); //menu.add(MENU_GROUP_CATALOGUE, MENU_APP_GRP_RENAME, 0, R.string.AppGroupRename) // .setIcon(R.drawable.ic_menu_notifications); menu.add(MENU_GROUP_CATALOGUE, MENU_APP_SWITCH_GRP, 0, R.string.AppGroupChoose) .setIcon(android.R.drawable.ic_menu_manage); menu.add(MENU_GROUP_CATALOGUE, MENU_APP_DELETE_GRP, 0, R.string.AppGroupDel) .setIcon(android.R.drawable.ic_menu_delete); return true; }
onPrepareOptionsMenu(Menu menu)
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- super.onPrepareOptionsMenu(menu);
- if(mIsEditMode || mIsWidgetEditMode)return false;
- // We can't trust the view state here since views we may not be done binding.
- // Get the vacancy state from the model instead.
- mMenuAddInfo = mWorkspace.findAllVacantCellsFromModel();
- menu.setGroupVisible(MENU_GROUP_ADD, mMenuAddInfo != null && mMenuAddInfo.valid && (!allAppsOpen) );
- menu.setGroupVisible(MENU_GROUP_NORMAL, !allAppsOpen);
- menu.setGroupVisible(MENU_GROUP_CATALOGUE, allAppsOpen);
- return true;
- }
@Override public boolean onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); if(mIsEditMode || mIsWidgetEditMode)return false; // We can't trust the view state here since views we may not be done binding. // Get the vacancy state from the model instead. mMenuAddInfo = mWorkspace.findAllVacantCellsFromModel(); menu.setGroupVisible(MENU_GROUP_ADD, mMenuAddInfo != null && mMenuAddInfo.valid && (!allAppsOpen) ); menu.setGroupVisible(MENU_GROUP_NORMAL, !allAppsOpen); menu.setGroupVisible(MENU_GROUP_CATALOGUE, allAppsOpen); return true; }
onOptionsItemSelected(MenuItem item)
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case MENU_ADD:
- addItems();
- return true;
- case MENU_WALLPAPER_SETTINGS:
- startWallpaper();
- return true;
- case MENU_SEARCH:
- onSearchRequested();
- return true;
- case MENU_NOTIFICATIONS:
- //showNotifications();
- //ADW: temp usage for desktop eiting
- if(allAppsOpen)closeAllApps(false);
- startDesktopEdit();
- return true;
- case MENU_ALMOSTNEXUS:
- showCustomConfig();
- return true;
- case MENU_APP_GRP_CONFIG:
- showAppList();
- return true;
- case MENU_APP_GRP_RENAME:
- showNewGrpDialog();
- return true;
- case MENU_APP_SWITCH_GRP:
- showSwitchGrp();
- return true;
- case MENU_APP_DELETE_GRP:
- showDeleteGrpDialog();
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case MENU_ADD: addItems(); return true; case MENU_WALLPAPER_SETTINGS: startWallpaper(); return true; case MENU_SEARCH: onSearchRequested(); return true; case MENU_NOTIFICATIONS: //showNotifications(); //ADW: temp usage for desktop eiting if(allAppsOpen)closeAllApps(false); startDesktopEdit(); return true; case MENU_ALMOSTNEXUS: showCustomConfig(); return true; case MENU_APP_GRP_CONFIG: showAppList(); return true; case MENU_APP_GRP_RENAME: showNewGrpDialog(); return true; case MENU_APP_SWITCH_GRP: showSwitchGrp(); return true; case MENU_APP_DELETE_GRP: showDeleteGrpDialog(); return true; } return super.onOptionsItemSelected(item); }
解釋下一些方法,便於記憶:
代碼中用到的方法用綠色標注,官方解釋為紅色,我的理解為藍色。
menu.add(MENU_GROUP_ADD, MENU_ADD, 0, R.string.menu_add)
.setIcon(android.R.drawable.ic_menu_add)
.setAlphabeticShortcut('A');
MenuItem android.view.Menu.add(int groupId, int itemId, int order, int titleRes)
Variation on add(int, int, int, CharSequence) that takes a string resource identifier instead of the string itself.
參數:
groupId The group identifier that this item should be part of. This can also be used to define groups of items for batch state changes. Normally use NONE if an item should not be in a group.
itemId Unique item ID. Use NONE if you do not need a unique ID.
order The order for the item. Use NONE if you do not care about the order. See MenuItem.getOrder().
titleRes Resource identifier of title string.
返回:
The newly added menu item.
groupId:分組ID
itemId:各項自己的UID
order:我理解為目錄,還沒具體看
titleRes:顯示文本信息
setIcon方法:設置文字上方的圖標
setAlphabeticShortcut方法:在MENU菜單下的快捷鍵,不是全鍵盤的機子幾乎不會用到的。
menu.setGroupVisible(MENU_GROUP_ADD, mMenuAddInfo != null && mMenuAddInfo.valid && (!allAppsOpen) );
void android.view.Menu.setGroupVisible(int group, boolean visible)
Show or hide all menu items that are in the given group.
參數:
group The group of items to operate on.
visible If true the items are visible, else they are hidden.
另請參閱:
MenuItem.setVisible
設置各個groupId組是夠顯示的方法
group:其實就是android.view.Menu.add裏麵的groupId
visible:是否顯示該組
最後更新:2017-04-02 06:51:56