zoukankan      html  css  js  c++  java
  • 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;
        }
  • 相关阅读:
    互联网时代,80后新时代的管理者
    使用YUI Compressor压缩CSS/JS
    使用最优方法来加速运行你的网站
    随笔 微笑
    首款LGA775平台离子迷你主板登场
    CSS调试技巧五则,兼谈“提问的艺术”
    SharpDevelop 编辑器
    穿越防火墙 让远程桌面自由连接
    开源的搜索引擎工具包和Web搜索引擎系统
    Javascript工具 使用JS Minifier过滤JS文件
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/4275254.html
Copyright © 2011-2022 走看看