Android 如何動態改變Actionbar上的item圖標


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;
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM