Android 如何动态改变Actionbar上的item图标

1.Activity菜单机制 (与dialog类似)
Activity有一套机制来实现对菜单的管理,方法如下:
1.public boolean onCreateOptionsMenu(Menu menu)
此方法用于初始化菜单,其中menu参数就是即将要显示的Menu实例。
返回true则显示该menu,false 则不显示;
(只会在第一次初始化菜单时调用)

2.public boolean onPrepareOptionsMenu(Menu menu)
在onCreateOptionsMenu执行后,菜单被显示前调用;如果菜单已经被创建,则在菜单显示前被调用。
同样的, 返回true则显示该menu,false 则不显示;
(可以通过此方法动态的改变菜单的状态,比如加载不同的菜单等,在onCreateOptionsMenu调用之后调用)

3.public void onOptionsMenuClosed(Menu menu)
每次菜单被关闭时调用.
(菜单被关闭有三种情形,menu按钮被再次点击、back按钮被点击或者用户选择了某一个菜单项)
            
4.public boolean onOptionsItemSelected(MenuItem item)
菜单项被点击时调用,也就是菜单项的监听方法。

通过这几个方法,可以得知,对于Activity,同一时间只能显示和监听一个Menu 对象。

但是这个onCreateOptionsMenu在activity的整个周期中只被调用一次,之后都不会变化,于是在android的较新版本里有了onPrepareOptionsMenu方法。

onCreateOptionsMenu方法是不能动态加载菜单的,因为他只调用了一次,你可以换onPrepareOptionsMenu这个方法来获取,他每次点击菜单都会调用。

由上面分析可知道,我们可以在onPrepareOptionsMenu里面改变item,但是如何实现在想改变Menu 的item的时候调用onPrepareOptionsMenu呢?

解决的办法是在你要更新菜单项的地方加上:

mActivity.getWindow().invalidatePanelMenu(Window.FEATURE_OPTIONS_PANEL);

这个是原生actionbar的解决办法,如果你用的是 ActionBarSherlock,那么调用

invalidateOptionsMenu();

/*
     *
     * 当文章刷新时候,如果赞过了显示ic_menu_fav_pressed图标
     */
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        System.out.println("执行了onPrepareOptionsMenu");
        if (collectionDB.isHasArtivle(article.getId())) {
            menu.findItem(R.id.action_fav).setIcon(
                    R.drawable.ic_menu_fav_pressed);
            menu.findItem(R.id.action_fav).setCheckable(false);
        } else {
            menu.findItem(R.id.action_fav).setIcon(R.drawable.ic_menu_fav);
            menu.findItem(R.id.action_fav).setCheckable(true);
        }
        // getSupportMenuInflater().inflate(R.menu.book_detail, menu);
        return super.onPrepareOptionsMenu(menu);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        System.out.println("执行了onCreateOptionsMenu");
        getSupportMenuInflater().inflate(R.menu.book_detail, menu);
        return true;
    }
时间: 2024-08-27 12:55:26

Android 如何动态改变Actionbar上的item图标的相关文章

动态改变actionbar上menu的图标

工作中遇到了一个需求是,在滚动的时候让actionbar上的图标进行变色.实现后在这里总结下思路. 一.先在主题中定义好Actionbar的style <style name="AppTheme" parent="BaseTheme"> <item name="actionBarStyle">@style/NAActionBarStyle</item> <item name="actionBar

Android 代码动态改变View的属性

原创文章,转载请注明 http://blog.csdn.net/leejizhou/article/details/51150116 李济洲的博客 设置Android View的长宽和位置我们平时都会在Layout的XML中定义,那么什么时候需要动态在代码中设置View的属性呢?先看下面这个UI设计 在这个UI设计中,上面的ImageView被设计成是长宽是16:9的比例,因为手机屏幕的区别,图片的宽度是无法确定的,所以在XML中是无法设置16:9比例的ImageView,因此想要实现这个UI效

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

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

storyboard时动态改变tabbarcontroller上tabbar数量

假如你是使用storyboard上构建的tabbarcontroller,TabbarController上有3个item这时候你想在代码里动态变更成2个,保留第一个和第三个,去掉中间一个,怎么办? 只需要用以下代码就搞定了: UITabBarController *tabBarController = (UITabBarController *)[UIApplication sharedApplication].delegate.window.rootViewController; NSMut

Android中动态更新TextView上的文字

示例代码: 1.新线程,定时更新文字 class testThread extends Thread{ public void run() { Message message = new Message(); mHandler.sendMessage(message); } } //在handler中更新UI private Handler mHandler = new Handler(){ public void handleMessage(Message msg) { textView.se

代码中设置 actionbar 上home等图标显示跟隐藏

今天在做项目的时候,遇到了一个问题,就是要把home在代码中动态显示跟隐藏.现在把方法记录如下 我们可以使用 setDisplayOptions(mask, mask); 来设置home按钮显示的,它的具体用法如下 (1)如果只有一个参数,那么它就是直接设定显示项, 如, int options = DISPLAY_SHOW_HOME | DISPLAY_USE_LOGO: setDisplayOptions(options); 那么,actionbar就会显示home跟log按钮,也就是,里面

【Android 应用开发】 ActionBar 基础

作者 : 万境绝尘 ([email protected]) 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/39204393 示例代码下载 :  -- GitHub : https://github.com/han1202012/Octopus_ActionBar.git -- CSDN : http://download.csdn.net/detail/han1202012/7913297 一. ActionBar 基本操作

如何动态改变报表的行高列宽

报表应用中有时需要动态控制行高或列宽以满足特定需要.如分组报表中要求每个分组的总高度 / 宽度固定不变,这样一来就能实现每页纸打印相同数量的分组. 润乾报表可以在行高列宽属性中编写表达式,从而实现动态行高列宽,下面通过一个例子说明使用过程. 1.连接数据源 使用润乾报表设计器,连接自带数据源 DEMO 2.设置数据集 新建报表并设置数据集,使用 SQL 取数 数据集 ds1 如下: SELECT STATE,EID,NAME,SURNAME,GENDER,DEPT,SALARY FROM EMP

android - Actionbar 上的 MenuItem 的 使用细节和优化

MenuItem是actionbar上的元素,ui设计的时候的很多用这个控件. 使用: 1.编写menu.xml资源文件 <span style="font-size:14px;"><menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:to