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

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

咱們常常會有這樣的需求,在切換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.xmlide

<?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

相關文章
相關標籤/搜索