1.Activity菜單機制 (與dialog類似)
Activity有一套機制來實現對菜單的管理,方法如下:
1.public boolean onCreateOptionsMenu(Menu menu)
此方法用於初始化菜單,其中menu參數就是即將要顯示的Menu實例。
返回true則顯示該menu,false 則不顯示;
(只會在第一次初始化菜單時調用)
2.public boolean onPrepareOptionsMenu(Menu menu)
在onCreateOptionsMenu執行后,菜單被顯示前調用;如果菜單已經被創建,則在菜單顯示前被調用。
同樣的, 返回true則顯示該menu,false 則不顯示;
(可以通過此方法動態的改變菜單的狀態,比如加載不同的菜單等,在onCreateOptionsMenu調用之后調用)
3.public void onOptionsMenuClosed(Menu menu)
每次菜單被關閉時調用.
(菜單被關閉有三種情形,menu按鈕被再次點擊、back按鈕被點擊或者用戶選擇了某一個菜單項)
4.public boolean onOptionsItemSelected(MenuItem item)
菜單項被點擊時調用,也就是菜單項的監聽方法。
通過這幾個方法,可以得知,對於Activity,同一時間只能顯示和監聽一個Menu 對象。
但是這個onCreateOptionsMenu在activity的整個周期中只被調用一次,之后都不會變化,於是在android的較新版本里有了onPrepareOptionsMenu方法。
onCreateOptionsMenu方法是不能動態加載菜單的,因為他只調用了一次,你可以換onPrepareOptionsMenu這個方法來獲取,他每次點擊菜單都會調用。
由上面分析可知道,我們可以在onPrepareOptionsMenu里面改變item,但是如何實現在想改變Menu 的item的時候調用onPrepareOptionsMenu呢?
解決的辦法是在你要更新菜單項的地方加上:
mActivity.getWindow().invalidatePanelMenu(Window.FEATURE_OPTIONS_PANEL);
這個是原生actionbar的解決辦法,如果你用的是 ActionBarSherlock,那么調用
invalidateOptionsMenu();
/* * * 當文章刷新時候,如果贊過了顯示ic_menu_fav_pressed圖標 */ @Override public boolean onPrepareOptionsMenu(Menu menu) { System.out.println("執行了onPrepareOptionsMenu"); if (collectionDB.isHasArtivle(article.getId())) { menu.findItem(R.id.action_fav).setIcon( R.drawable.ic_menu_fav_pressed); menu.findItem(R.id.action_fav).setCheckable(false); } else { menu.findItem(R.id.action_fav).setIcon(R.drawable.ic_menu_fav); menu.findItem(R.id.action_fav).setCheckable(true); } // getSupportMenuInflater().inflate(R.menu.book_detail, menu); return super.onPrepareOptionsMenu(menu); } @Override public boolean onCreateOptionsMenu(Menu menu) { System.out.println("執行了onCreateOptionsMenu"); getSupportMenuInflater().inflate(R.menu.book_detail, menu); return true; }