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
相关产品推荐
相关产品推荐

