actionBar和Toolbar中如何動態隱藏和修改menu上的選單
阿新 • • 發佈:2019-01-22
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,再次執行,就會有效果了