You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android如何禁用菜单项同时移除默认灰色文字样式?

问题原因

当你调用setEnabled(false)将菜单项设为禁用时,Android系统会自动为菜单项文字应用全局禁用态的灰色样式,覆盖你之前设置的Spannable样式,因此出现文字变灰、加粗效果丢失的问题。

解决方案1:保留禁用状态,直接在Spannable中指定文字颜色

你可以在设置加粗Span的同时,额外添加ForegroundColorSpan指定你需要的文字颜色,这个样式优先级高于系统的禁用态样式,不会被覆盖:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);
    MenuItem createItem = menu.findItem(R.id.title);
    SpannableString spanString = new SpannableString(createItem.getTitle().toString());
    // 加粗样式
    spanString.setSpan(new StyleSpan(Typeface.BOLD), 0, spanString.length(), 0);
    // 自定义文字颜色,可替换为你需要的色值,推荐从主题属性中获取适配深色/浅色模式
    spanString.setSpan(new ForegroundColorSpan(Color.BLACK), 0, spanString.length(), 0);
    createItem.setTitle(spanString);
    createItem.setCheckable(false);
    createItem.setEnabled(false);
    MenuCompat.setGroupDividerEnabled(menu, true);
    return true;
}

如果需要适配主题颜色,不要写死Color.BLACK,可以用如下方式获取系统主题里的主文字色:

TypedValue typedValue = new TypedValue();
getTheme().resolveAttribute(android.R.attr.textColorPrimary, typedValue, true);
int textColor = typedValue.data;
spanString.setSpan(new ForegroundColorSpan(textColor), 0, spanString.length(), 0);

解决方案2:不设置禁用状态,拦截点击事件实现不可点击

更简单的方式是不调用setEnabled(false),这样菜单项会保持正常的启用态样式,只需要在菜单点击回调中拦截这个标题项的点击事件即可:
首先修改onCreateOptionsMenu代码,去掉setEnabled(false)的调用:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);
    MenuItem createItem = menu.findItem(R.id.title);
    SpannableString spanString = new SpannableString(createItem.getTitle().toString());
    spanString.setSpan(new StyleSpan(Typeface.BOLD), 0, spanString.length(), 0);
    createItem.setTitle(spanString);
    createItem.setCheckable(false);
    MenuCompat.setGroupDividerEnabled(menu, true);
    return true;
}

然后在onOptionsItemSelected中拦截该菜单项的点击:

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    if (item.getItemId() == R.id.title) {
        // 直接返回true,不做任何处理,实现不可点击效果
        return true;
    }
    // 其他菜单项的处理逻辑
    return super.onOptionsItemSelected(item);
}

这个方案不需要额外设置颜色,会自动适配当前主题的文字样式,更推荐使用。

内容的提问来源于stack exchange,提问作者Kishy Nivas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 03:06:03