动态改变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接口即可。

时间: 2024-11-05 06:28:16

动态改变ToolBar中的MenuItem的相关文章

转--动态改变UITableView中的Cell高度

往往在开发iPhone的应用过程中用得最多的应该算是UITableVIew了,凭着IOS给UITableView赋予了这种灵活的框架结构,让它不管在显示列表方面还是在排版方面都有着一定的优势.虽然UITableView功能强大,但是对于一些复杂的应用需求在开发的过程中会出现一些问题,如动态改变UITableView显示的Cell高度就是其中之一 其实想要改变UITableView的Cell高度并不难,UITableView带有一个rowHeight属性,使用他就可以改变高度了.但是这样的改变是把

cocos2d-x改底层之动态改变UIListView中的某项在链表中的位置

先看一下UIListView添加.插入.删除的机制,再来考虑如何移动某一项在链表中得位置. UIListView.h /* 所有项用一个数组来保存 */ CCArray* _items; void ListView::pushBackCustomItem(Widget* item) { /* 向数组中添加一项 */ _items->addObject(item); remedyLayoutParameter(item); addChild(item); _refreshViewDirty = t

小程序开发之改变data中数组或对象的某一属性值

前言:在小程序的开发中,我们在view中便利data中数组或对象时,很多情况下需要在js中动态改变数组或者对象中某一香的属性值. 效果图: 我给大家总结了案例如下: wxml如下: <scroll-view class='hd-cont' scroll-x="true" style='width: 100%'> <view wx:for="{{sDate}}" wx:key="{{index}}" class='date-con

WPF 中动态改变控件模板

在某些项目中,可能需要动态的改变控件的模板,例如软件中可以选择不同的主题,在不同的主题下软件界面.控件的样式都会有所不同,这时即可通过改变控件模板的方式实现期望的功能. 基本方法是当用户点击切换主题按钮是加载新的资源字典,并使用新加载的资源字典替代当前的资源字典这时要用到ResourceManager. 假设现有两个不同的资源字典文件Dictionary1.xaml和Dictionary2.xaml存在于Themes文件夹内: 在MainPage中使用其中一个资源字典作为默认样式文件: <Win

动态数组,数组初始化,数组内存释放,向数组中添加一个元素,向数组中添加多个元素,数组打印,顺序查找,二分查找,查找数组并返回地址,冒泡排序,改变数组中某个元素的值,删除一个数值,删除所有,查找含有

 1定义接口: Num.h #ifndef_NUM_H_ #define_NUM_H_ #include<stdio.h> #include<stdlib.h> /************************************************************************/ /*数组的结构体类型                                                    */ /*******************

C# 设计时动态改变实体在PropertyGrid中显示出来的属性

方法一: /// <summary> /// 实体属性处理 /// </summary> public class PropertyHandle { #region 反射控制只读.可见属性 //SetPropertyVisibility(obj, "名称 ", true); //obj指的就是你的SelectObject, "名称"是你SelectObject的一个属性 //当然,调用这两个方法后,重新SelectObject一下,就可以了.

利用runtime实现延展动态改变模型类中属性的set,get方法

昨天大概的阐述了一下关于构架控制容器的概念,但是如果要丰满这个想法还有很多问题,比如如果我想对一些controller进行管理就势必涉及到controller的加载以及缓存,而想做这些的前提就是构建一个controller表.对表中设定的字符串管理,从而管理对应的controller.传统创建表的方法有很多,最为常用的就是plist文件,但是对于iOS开发的程序员来说,如果这个plist写死,在管理的时候就会比较死板,要知道oc是一门灵活的,动态的语言.如果我们使用NSUserDefaults,

代码中动态改变布局属性RelativeLayout.LayoutParams.addRule()

我们知道,在 RelativeLayout 布局中有很多特殊的属性,通常在载入布局之前,在相关的xml文件中进行静态设置即可. 但是,在有些情况下,我们需要动态设置布局的属性,在不同的条件下设置不同的布局排列方式,这时候就需要用到 RelativeLayout.LayoutParams.addRule() 方法,该方法有两种重载方式: addRule(int verb) :用此方法时,所设置节点的属性不能与其它兄弟节点相关联或者属性值为布尔值(布尔值的属性,设置时表示该属性为 true,不设置就

动态改变actionbar的menu菜单MenuItem的显示

onCreateOptionsMenu(Menu menu)方法中我们能够通过getMenuInflater().inflate(R.menu.list_option, menu);来构建一个菜单,并通过 1 menu.findItem(R.id.menu) 获得具体的一个菜单项.但这个onCreateOptionsMenu在activity的整个周期中只被调用一次,之后都不会变化,于是在android的较新版本里有了onPrepareOptionsMenu方法. onCreateOptions