動態更新Toolbar Menu以及Menu中同時顯示文字和圖標


動態更新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中處理點擊事件就可以了。


免責聲明!

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



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