1. 程式人生 > >actionBar和Toolbar中如何動態隱藏和修改menu上的選單

actionBar和Toolbar中如何動態隱藏和修改menu上的選單

       actionBar大家都應該很熟了,非常好用的東西,如果不是很熟,可以看一下http://blog.csdn.net/guolin_blog/article/details/18234477,裡面介紹的相當詳細,而Toolbar是在5.0上出現的,也非常好用,而且它向下支援到2.2基本上現在的手機都可以用,說一點,知乎的頁面,應該就是用它做的。

      這兩種控制元件,都有一個Menu的功能,這裡不多介紹,網上都有,這裡我要說的是如何動態的修改Menu上面的選單,這裡我的應用比較簡單,就是顯示和隱藏其中的一個選單,大家看一下,下面的四個圖:

     

請大家不要注意細節,我們只是看一下功能,前兩個頁面是 當前fragment為主頁面的,後兩個是fragment為發現的,這裡大家會發現,為“發現”的比“首頁”多了一個選單在Menu當中,這個怎麼實現的呢。

我們都知道,我們在建立actionbar或是toolbar的時候,都會預設的實現兩個方法,分別是onCreateOptionsMenu和onOptionsItemSelected,這兩個方法,前面的是建立選單,後面的對選中的選單進行操作。onCreateOptionsMenu這個只在頁面載入的時候,執行一次,其後就不在運行了,也就是說它只一次載入完之後,就不會再動了,所以想改變Menu在這裡是不可能的,還好的android提供了一個方法叫onPrepareOptionsMenu,它的功能是在每次點選一個Menu的時候,它就改變一次,所以你想要改變Menu的值,就得在這裡執行。程式碼如下:

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        Intent intent = new Intent();

        switch (item.getItemId())
        {
            case R.id.main_toolbar_search:
                Toast.makeText(this,"main_toolbar_search",Toast.LENGTH_LONG).show();
                break;
            case R.id.main_toolbar_notify:
                Toast.makeText(this,"main_toolbar_notify",Toast.LENGTH_LONG).show();
                break;
            case R.id.main_toolbar_about:
                intent.setClass(this, AboutActivity.class);
                break;
            case R.id.main_toolbar_register:
                Toast.makeText(this,"main_toolbar_register",Toast.LENGTH_LONG).show();
                break;
            case R.id.main_toolbar_shuffle:
                Toast.makeText(this,"main_toolbar_shuffle",Toast.LENGTH_LONG).show();
                break;
        }

        startActivity(intent);
        //切換動畫一定要放在startActivity後面,並且一定要先進後出
        overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left);

        return super.onOptionsItemSelected(item);
    }


    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        Log.e("isMenuShuffle",isMenuShuffle + "");
        if(isMenuShuffle)
        {
            menu.findItem(R.id.main_toolbar_shuffle).setVisible(true);
        }else
        {
            menu.findItem(R.id.main_toolbar_shuffle).setVisible(false);
        }
        return super.onPrepareOptionsMenu(menu);
    }

     這裡呢,我使用的是切換fragment的方法,來變化頁面的。寫到這裡,我們執行一下,會發現,根本沒有任何變化,因為isMenuShuffle在初始的時候設定成了false可是點選事件的時候,我們修改過啊。可是卻沒有執行onPrepareOptionsMenu這個方法,為什麼?因為這個方法,是在點選Menu上的選單,才會變,這怎麼辦,android給我們提供了一個方法,

      在你點選切換fragment的事件之後。加上

     actionBar:  

this.getWindow().invalidatePanelMenu(Window.FEATURE_OPTIONS_PANEL);
   toolBar:
<pre name="code" class="java">invalidateOptionsMenu();


OK,再次執行,就會有效果了