我们经常会有这样的需求,在切换Fragment或者点击某个按钮后动态更新Toolbar上Menu项.但是onCreateOptionsMenu方法只在创建Activity的时候调用一次,以后就不再调用了,所以就不能在onCreateOptionsMenu中做处理了。

不过系统提供了另外的一个方法onPrepareOptionsMenu,我们可以在这个方法中做一些逻辑处理,然后在需要更新Menu的地方调用invalidateOptionsMenu方法。 效果图如下:

点击`管理专辑`按钮更换Menu,





![](http://images2015.cnblogs.com/blog/902237/201607/902237-20160720181845747-1609503965.png)
```

<span class="fu"><span class="hljs-meta">@Override</span></span> <span class="kw"><span class="hljs-function"><span class="hljs-keyword">public</span></span></span> <span class="dt"><span class="hljs-function"><span class="hljs-keyword">boolean</span></span></span> <span class="fu"><span class="hljs-function"><span class="hljs-title">onCreateOptionsMenu</span></span></span><span class="hljs-function"><span class="hljs-params">(Menu menu)</span> </span>{ <span class="fu">getMenuInflater</span>().<span class="fu">inflate</span>(R.<span class="fu">menu</span>.<span class="fu">menu</span>, menu); <span class="kw"><span class="hljs-keyword">return</span></span> <span class="kw"><span class="hljs-keyword">super</span></span>.<span class="fu">onCreateOptionsMenu</span>(menu); }

  </div>
  
  <div class="sourceCode">
    <div class="top-box hide">
    </div>
    
    ```
`&lt;span class="fu">&lt;span class="hljs-meta">@Override&lt;/span>&lt;/span>
    &lt;span class="kw">&lt;span class="hljs-function">&lt;span class="hljs-keyword">public&lt;/span>&lt;/span>&lt;/span> &lt;span class="dt">&lt;span class="hljs-function">&lt;span class="hljs-keyword">boolean&lt;/span>&lt;/span>&lt;/span> &lt;span class="fu">&lt;span class="hljs-function">&lt;span class="hljs-title">onPrepareOptionsMenu&lt;/span>&lt;/span>&lt;/span>&lt;span class="hljs-function">&lt;span class="hljs-params">(Menu menu)&lt;/span> &lt;/span>{
        &lt;span class="kw">&lt;span class="hljs-keyword">if&lt;/span>&lt;/span> (mIsEditStatus) {
            menu.&lt;span class="fu">findItem&lt;/span>(R.&lt;span class="fu">id&lt;/span>.&lt;span class="fu">action_share&lt;/span>).&lt;span class="fu">setVisible&lt;/span>(&lt;span class="kw">&lt;span class="hljs-keyword">false&lt;/span>&lt;/span>);
            menu.&lt;span class="fu">findItem&lt;/span>(R.&lt;span class="fu">id&lt;/span>.&lt;span class="fu">action_edit&lt;/span>).&lt;span class="fu">setVisible&lt;/span>(&lt;span class="kw">&lt;span class="hljs-keyword">true&lt;/span>&lt;/span>);
        } &lt;span class="kw">&lt;span class="hljs-keyword">else&lt;/span>&lt;/span> {
            menu.&lt;span class="fu">findItem&lt;/span>(R.&lt;span class="fu">id&lt;/span>.&lt;span class="fu">action_share&lt;/span>).&lt;span class="fu">setVisible&lt;/span>(&lt;span class="kw">&lt;span class="hljs-keyword">true&lt;/span>&lt;/span>);
            menu.&lt;span class="fu">findItem&lt;/span>(R.&lt;span class="fu">id&lt;/span>.&lt;span class="fu">action_edit&lt;/span>).&lt;span class="fu">setVisible&lt;/span>(&lt;span class="kw">&lt;span class="hljs-keyword">false&lt;/span>&lt;/span>);
        }
        &lt;span class="kw">&lt;span class="hljs-keyword">return&lt;/span>&lt;/span> &lt;span class="kw">&lt;span class="hljs-keyword">super&lt;/span>&lt;/span>.&lt;span class="fu">onPrepareOptionsMenu&lt;/span>(menu);
    }`
``` `<span class="fu">invalidateOptionsMenu</span>(); <span class="co"><span class="hljs-comment">//重新绘制menu</span></span>` ```
另外的一个需求是在Menu中要显示图标和文字,虽然在`menu.xml`文件中配置了图标和文字,但是在有图标的情况下文字是不会显示的,即使设置 `app:showAsAction="always|withText"` 但是我在运行的时候发现并没有显示文字,处理方法是通过另外一个属性实现`app:actionLayout`.

首先menu.xml定义如下:

```

<item android:id=&quot;@+id/action_share&quot;
      android:title=&quot;分享&quot;
      android:orderInCategory=&quot;80&quot;
      android:icon=&quot;@drawable/icon_share_white&quot;
      app:showAsAction=&quot;always|withText&quot; />

<item android:id=&quot;@+id/action_edit&quot;
      android:title=&quot;&quot;
      android:orderInCategory=&quot;60&quot;
      app:showAsAction=&quot;always&quot;
      app:actionLayout=&quot;@layout/menu_action_album_edit&quot;
    />
" data-snippet-id="ext.be441354fd8820bfea71da7e5777101d" data-snippet-saved="false" data-codota-status="done">`<span class="kw"><span class="hljs-tag"><<span class="hljs-name">menu</span></span></span><span class="ot"><span class="hljs-tag"> <span class="hljs-attr">xmlns:android</span>=</span></span><span class="st"><span class="hljs-tag"><span class="hljs-string">"http://schemas.android.com/apk/res/android"</span></span></span> <span class="ot"><span class="hljs-tag"> <span class="hljs-attr">xmlns:app</span>=</span></span><span class="st"><span class="hljs-tag"><span class="hljs-string">"http://schemas.android.com/apk/res-auto"</span></span></span> <span class="ot"><span class="hljs-tag"> <span class="hljs-attr">xmlns:tools</span>=</span></span><span class="st"><span class="hljs-tag"><span class="hljs-string">"http://schemas.android.com/tools"</span></span></span> <span class="ot"><span class="hljs-tag"> <span class="hljs-attr">tools:context</span>=</span></span><span class="st"><span class="hljs-tag"><span class="hljs-string">".album.AlbumDetailActivity"</span></span></span><span class="kw"><span class="hljs-tag">></span></span>
&lt;span class="kw">&lt;span class="hljs-tag">&lt;&lt;span class="hljs-name">item&lt;/span>&lt;/span>&lt;/span>&lt;span class="ot">&lt;span class="hljs-tag"> &lt;span class="hljs-attr">android:id&lt;/span>=&lt;/span>&lt;/span>&lt;span class="st">&lt;span class="hljs-tag">&lt;span class="hljs-string">"@+id/action_share"&lt;/span>&lt;/span>&lt;/span>

<span class=“ot”><span class=“hljs-tag”> <span class=“hljs-attr”>android:title</span>=</span></span><span class=“st”><span class=“hljs-tag”><span class=“hljs-string”>“分享”</span></span></span> <span class=“ot”><span class=“hljs-tag”> <span class=“hljs-attr”>android:orderInCategory</span>=</span></span><span class=“st”><span class=“hljs-tag”><span class=“hljs-string”>“80”</span></span></span> <span class=“ot”><span class=“hljs-tag”> <span class=“hljs-attr”>android:icon</span>=</span></span><span class=“st”><span class=“hljs-tag”><span class=“hljs-string”>"@drawable/icon_share_white"</span></span></span> <span class=“ot”><span class=“hljs-tag”> <span class=“hljs-attr”>app:showAsAction</span>=</span></span><span class=“st”><span class=“hljs-tag”><span class=“hljs-string”>“always|withText”</span></span></span> <span class=“kw”><span class=“hljs-tag”>/></span></span>

&lt;span class="kw">&lt;span class="hljs-tag">&lt;&lt;span class="hljs-name">item&lt;/span>&lt;/span>&lt;/span>&lt;span class="ot">&lt;span class="hljs-tag"> &lt;span class="hljs-attr">android:id&lt;/span>=&lt;/span>&lt;/span>&lt;span class="st">&lt;span class="hljs-tag">&lt;span class="hljs-string">"@+id/action_edit"&lt;/span>&lt;/span>&lt;/span>

<span class=“ot”><span class=“hljs-tag”> <span class=“hljs-attr”>android:title</span>=</span></span><span class=“st”><span class=“hljs-tag”><span class=“hljs-string”>""</span></span></span> <span class=“ot”><span class=“hljs-tag”> <span class=“hljs-attr”>android:orderInCategory</span>=</span></span><span class=“st”><span class=“hljs-tag”><span class=“hljs-string”>“60”</span></span></span> <span class=“ot”><span class=“hljs-tag”> <span class=“hljs-attr”>app:showAsAction</span>=</span></span><span class=“st”><span class=“hljs-tag”><span class=“hljs-string”>“always”</span></span></span> <span class=“ot”><span class=“hljs-tag”> <span class=“hljs-attr”>app:actionLayout</span>=</span></span><span class=“st”><span class=“hljs-tag”><span class=“hljs-string”>"@layout/menu_action_album_edit"</span></span></span> <span class=“kw”><span class=“hljs-tag”>/></span></span>

<span class=“kw”><span class=“hljs-tag”></<span class=“hljs-name”>menu</span>></span></span>`

  </div>
  
  

    `app:actionLayout`指向了一个布局,可以在这个布局中定义你想要的控件。我的定义是这样的。
 `menu_action_album_edit.xml`
  

  
  <div class="sourceCode">
    <div class="top-box hide">
    </div>
    
    ```

<TextView xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
          android:layout_width=&quot;wrap_content&quot;
          android:layout_height=&quot;wrap_content&quot;
          android:paddingLeft=&quot;10dip&quot;
          android:paddingRight=&quot;10dip&quot;
          android:gravity=&quot;center&quot;
          android:text=&quot;@string/app_edit&quot;
          android:drawableLeft=&quot;@drawable/album_edit_white&quot;
          android:textColor=&quot;@color/white&quot;
          android:clickable=&quot;true&quot; />" data-snippet-id="ext.67853aa79917befa6351c9258124c9c9" data-snippet-saved="false" data-codota-status="done">`&lt;span class="kw">&lt;span class="hljs-meta">&lt;?xml&lt;/span>&lt;/span>&lt;span class="hljs-meta"> version="1.0" encoding="utf-8"&lt;/span>&lt;span class="kw">&lt;span class="hljs-meta">?&gt;&lt;/span>&lt;/span>
&lt;span class="kw">&lt;span class="hljs-tag">&lt;&lt;span class="hljs-name">TextView&lt;/span>&lt;/span>&lt;/span>&lt;span class="ot">&lt;span class="hljs-tag"> &lt;span class="hljs-attr">xmlns:android&lt;/span>=&lt;/span>&lt;/span>&lt;span class="st">&lt;span class="hljs-tag">&lt;span class="hljs-string">"http://schemas.android.com/apk/res/android"&lt;/span>&lt;/span>&lt;/span>
&lt;span class="ot">&lt;span class="hljs-tag">          &lt;span class="hljs-attr">android:layout_width&lt;/span>=&lt;/span>&lt;/span>&lt;span class="st">&lt;span class="hljs-tag">&lt;span class="hljs-string">"wrap_content"&lt;/span>&lt;/span>&lt;/span>
&lt;span class="ot">&lt;span class="hljs-tag">          &lt;span class="hljs-attr">android:layout_height&lt;/span>=&lt;/span>&lt;/span>&lt;span class="st">&lt;span class="hljs-tag">&lt;span class="hljs-string">"wrap_content"&lt;/span>&lt;/span>&lt;/span>
&lt;span class="ot">&lt;span class="hljs-tag">          &lt;span class="hljs-attr">android:paddingLeft&lt;/span>=&lt;/span>&lt;/span>&lt;span class="st">&lt;span class="hljs-tag">&lt;span class="hljs-string">"10dip"&lt;/span>&lt;/span>&lt;/span>
&lt;span class="ot">&lt;span class="hljs-tag">          &lt;span class="hljs-attr">android:paddingRight&lt;/span>=&lt;/span>&lt;/span>&lt;span class="st">&lt;span class="hljs-tag">&lt;span class="hljs-string">"10dip"&lt;/span>&lt;/span>&lt;/span>
&lt;span class="ot">&lt;span class="hljs-tag">          &lt;span class="hljs-attr">android:gravity&lt;/span>=&lt;/span>&lt;/span>&lt;span class="st">&lt;span class="hljs-tag">&lt;span class="hljs-string">"center"&lt;/span>&lt;/span>&lt;/span>
&lt;span class="ot">&lt;span class="hljs-tag">          &lt;span class="hljs-attr">android:text&lt;/span>=&lt;/span>&lt;/span>&lt;span class="st">&lt;span class="hljs-tag">&lt;span class="hljs-string">"@string/app_edit"&lt;/span>&lt;/span>&lt;/span>
&lt;span class="ot">&lt;span class="hljs-tag">          &lt;span class="hljs-attr">android:drawableLeft&lt;/span>=&lt;/span>&lt;/span>&lt;span class="st">&lt;span class="hljs-tag">&lt;span class="hljs-string">"@drawable/album_edit_white"&lt;/span>&lt;/span>&lt;/span>
&lt;span class="ot">&lt;span class="hljs-tag">          &lt;span class="hljs-attr">android:textColor&lt;/span>=&lt;/span>&lt;/span>&lt;span class="st">&lt;span class="hljs-tag">&lt;span class="hljs-string">"@color/white"&lt;/span>&lt;/span>&lt;/span>
&lt;span class="ot">&lt;span class="hljs-tag">          &lt;span class="hljs-attr">android:clickable&lt;/span>=&lt;/span>&lt;/span>&lt;span class="st">&lt;span class="hljs-tag">&lt;span class="hljs-string">"true"&lt;/span>&lt;/span>&lt;/span> &lt;span class="kw">&lt;span class="hljs-tag">/&gt;&lt;/span>&lt;/span>`
`android:drawableLeft`中指定你的图标。

然后还要在onCreateOptionsMenu中重写一下Menu的点击事件,现在onCreateOptionsMenu方法是这样的:

```

`<span class=“fu”><span class=“hljs-meta”>@Override</span></span> <span class=“kw”><span class=“hljs-function”><span class=“hljs-keyword”>public</span></span></span> <span class=“dt”><span class=“hljs-function”><span class=“hljs-keyword”>boolean</span></span></span> <span class=“fu”><span class=“hljs-function”><span class=“hljs-title”>onCreateOptionsMenu</span></span></span><span class=“hljs-function”><span class=“hljs-params”>(Menu menu)</span> </span>{ <span class=“fu”>getMenuInflater</span>().<span class=“fu”>inflate</span>(R.<span class=“fu”>menu</span>.<span class=“fu”>menu</span>, menu); <span class=“dt”><span class=“hljs-keyword”>final</span></span> MenuItem item = menu.<span class=“fu”>findItem</span>(R.<span class=“fu”>id</span>.<span class=“fu”>action_edit</span>); item.<span class=“fu”>getActionView</span>().<span class=“fu”>setOnClickListener</span>(<span class=“kw”><span class=“hljs-keyword”>new</span></span> View.<span class=“fu”>OnClickListener</span>() { <span class=“fu”><span class=“hljs-meta”>@Override</span></span> <span class=“kw”><span class=“hljs-function”><span class=“hljs-keyword”>public</span></span></span> <span class=“dt”><span class=“hljs-function”><span class=“hljs-keyword”>void</span></span></span> <span class=“fu”><span class=“hljs-function”><span class=“hljs-title”>onClick</span></span></span><span class=“hljs-function”><span class=“hljs-params”>(View v)</span> </span>{ <span class=“fu”>onOptionsItemSelected</span>(item); } });

    &lt;span class="kw">&lt;span class="hljs-keyword">return&lt;/span>&lt;/span> &lt;span class="kw">&lt;span class="hljs-keyword">super&lt;/span>&lt;/span>.&lt;span class="fu">onCreateOptionsMenu&lt;/span>(menu);
}`
  </div>
  
  

    然后像普通的Menu item一样在onOptionsItemSelected中处理点击事件就可以了。
  

</div>

<div class="clear">
</div>

<div id="blog_post_info_block">
</div>

💬 评论