如何动态改变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尼?


解决的办法是在你要更新菜单项的地方加上:
1
mActivity.getWindow().invalidatePanelMenu(Window.FEATURE_OPTIONS_PANEL);

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

1
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;
	}




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值