动态改变ToolBar中的MenuItem

最近项目中开始使用到ToolBar控件,其中有需求需要动态改变ToolBar中的MenuItem。如下图:

1、首先想到的办法是利用ToolBar自带的方法addView()removeView().

经测试,动态添加和删除view没有点击效果,需要自己添加,而且如果需要overflow效果,则需要自己实现PopupMenu,所以此方法适用于view比较少的情况。

2、ToolBar是用来替换ActionBar的,用过ActionBar的人应该都熟悉ActionMenuView,使用ActionMenuView配合ToolBar则可以实现动态改变ToolBar中的MenuItem,实际上改变的是ActionMenuView中的item。

1)、在布局文件中把ActionMenuView当作ToolBar的child;

<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    style="@style/ToolBar">

    <android.support.v7.widget.ActionMenuView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/action_menu_view"
        android:layout_gravity="right"/>

</android.support.v7.widget.Toolbar>

其中style/ToolBar如下:

<style name="ToolBar">
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:id">@id/toolbar</item>
        <item name="android:background">@color/myPrimaryColor</item>
        <item name="theme">@style/ToolBarTheme</item>
        <!--貌似无效 -->
        <item name="popupTheme">@style/ToolBarPopupTheme</item>
    </style>

    <style name="ToolBarTheme" parent="ThemeOverlay.AppCompat.Light">
        <item name="android:textColorPrimary">@color/abc_primary_text_material_dark</item>
        <item name="android:textColorSecondary">@color/abc_primary_text_material_dark</item>
        <item name="android:colorBackground">@color/myPrimaryColor</item>
    </style>

    <style name="ToolBarPopupTheme" parent="ThemeOverlay.AppCompat.Light">
        <item name="android:textColorPrimary">@color/abc_primary_text_material_light</item>
        <item name="android:textColorSecondary">@color/abc_primary_text_material_light</item>
        <item name="android:colorBackground">@color/myPrimaryColor</item>
    </style>

2)、在代码中,首先在Activity的onCreate()中findview,然后在需要的地方添加MenuItem,和Menu的使用方法一样;

actionMenuView = (ActionMenuView) findViewById(R.id.action_menu_view);
//设置MenuItem点击事件
actionMenuView.setOnMenuItemClickListener(this);

......

//清除之前的MenuItem
actionMenuView.getMenu().clear();
//添加新的MenuItem
getMenuInflater().inflate(R.menu.xxx,actionMenuView.getMenu());

效果图如下:

3)、点击事件相应:实现ActionMenuView.OnMenuItemClickListener接口即可。

posted @ 2015-07-30 15:24  Alex_the_coder  阅读(7658)  评论(0编辑  收藏  举报