actionbar -- 溢出菜单中既显示图标又显示文字

本文介绍如何在 Android 应用的溢出菜单中显示图标。通过反射修改 MenuBuilder 类中的 mOptionalIconsVisible 值,实现菜单项图标与文字同时展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通常,在溢出菜单中的显示是只有文字,如下图:

 

现在我们想要显示为下图中的样式,既有图标又有文字:

 

 

1.首先我们来看一下android源码,MenuBuilder.java

是否显示这个值是由MenuBuilder的变量值mOptionalIconsVisible决定的。该值默认是false的。

<pre class="java" name="code">       
private boolean mOptionalIconsVisible = false;

 void setOptionalIconsVisible(boolean visible) {
            mOptionalIconsVisible = visible;
        }
    
  
 boolean getOptionalIconsVisible() {
            return mOptionalIconsVisible;
        }
    

 


2.由于MenuBuilder.java是系统的内部框架类,我们需要通过反射的方法将该值mOptionalIconsVisible 设为true,即显示出icon图片。

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// TODO Auto-generated method stub
		MenuInflater mMenuInflater = new MenuInflater(this);
		mMenuInflater.inflate(R.menu.simrecord_menu, menu);

		setIconVisable(menu,true);
		
		return true;
	}
<pre class="java" name="code">	public void setIconVisible(Menu menu, boolean visable){
		Field field;
		try {
			field = menu.getClass().getDeclaredField("mOptionalIconsVisible");
			
			Log.d(TAG," setIconVisible1() field="+field);
			field.setAccessible(true);
			field.set(menu, visable);
		} catch (NoSuchFieldException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
		
	}

 

在反射中,getDeclaredField()获取MenuBuilder.java中的属性值mOptionalIconsVisible。

通过field.set(menu, visable);设置该值为true。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值