動態更新Toolbar Menu以及Menu中同時顯示文字和圖標
我們經常會有這樣的需求,在切換Fragment或者點擊某個按鈕后動態更新Toolbar上Menu項.但是onCreateOptionsMenu方法只在創建Activity的時候調用一次,以后就不再調用了,所以就不能在onCreateOptionsMenu中做處理了。
不過系統提供了另外的一個方法onPrepareOptionsMenu,我們可以在這個方法中做一些邏輯處理,然后在需要更新Menu的地方調用invalidateOptionsMenu方法。
效果圖如下:
點擊管理專輯
按鈕更換Menu,
@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
定義如下:
<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
<?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中處理點擊事件就可以了。