咱們常常會有這樣的需求,在切換Fragment或者點擊某個按鈕後動態更新Toolbar上Menu項.可是onCreateOptionsMenu方法只在建立Activity的時候調用一次,之後就再也不調用了,因此就不能在onCreateOptionsMenu中作處理了。
不過系統提供了另外的一個方法onPrepareOptionsMenu,咱們能夠在這個方法中作一些邏輯處理,而後在須要更新Menu的地方調用invalidateOptionsMenu方法。
效果圖以下:
java
點擊管理專輯
按鈕更換Menu,android
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu, menu); return super.onCreateOptionsMenu(menu); }
@Override public boolean onPrepareOptionsMenu(Menu menu) { if (mIsEditStatus) { menu.findItem(R.id.action_share).setVisible(false); menu.findItem(R.id.action_edit).setVisible(true); } else { menu.findItem(R.id.action_share).setVisible(true); menu.findItem(R.id.action_edit).setVisible(false); } return super.onPrepareOptionsMenu(menu); }
invalidateOptionsMenu(); //從新繪製menu
另外的一個需求是在Menu中要顯示圖標和文字,雖然在menu.xml
文件中配置了圖標和文字,可是在有圖標的狀況下文字是不會顯示的,即便設置 app:showAsAction="always|withText"
可是我在運行的時候發現並無顯示文字,處理方法是經過另一個屬性實現app:actionLayout
.
首先menu.xml
定義以下:app
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context=".album.AlbumDetailActivity"> <item android:id="@+id/action_share" android:title="分享" android:orderInCategory="80" android:icon="@drawable/icon_share_white" app:showAsAction="always|withText" /> <item android:id="@+id/action_edit" android:title="" android:orderInCategory="60" app:showAsAction="always" app:actionLayout="@layout/menu_action_album_edit" /> </menu>
app:actionLayout
指向了一個佈局,能夠在這個佈局中定義你想要的控件。個人定義是這樣的。
menu_action_album_edit.xml
ide
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="10dip" android:paddingRight="10dip" android:gravity="center" android:text="@string/app_edit" android:drawableLeft="@drawable/album_edit_white" android:textColor="@color/white" android:clickable="true" />
android:drawableLeft
中指定你的圖標。
而後還要在onCreateOptionsMenu
中重寫一下Menu的點擊事件,如今onCreateOptionsMenu
方法是這樣的:佈局
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu, menu); final MenuItem item = menu.findItem(R.id.action_edit); item.getActionView().setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onOptionsItemSelected(item); } }); return super.onCreateOptionsMenu(menu); }
而後像普通的Menu item同樣在onOptionsItemSelected中處理點擊事件就能夠了。code