所以我有一个菜单项,定义为:
<item
android:id="@+id/action_live"
android:title="@string/action_live"
android:orderInCategory="1"
app:showAsAction="ifRoom|withText" />
它显示为文本,如下所示:
我想以编程方式更改“LIVE”文本颜色。找了一阵子,找到了一个方法:
全局定义:
private Menu mOptionsMenu;
和:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
mOptionsMenu = menu;
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
我愿意:
MenuItem liveitem = mOptionsMenu.findItem(R.id.action_live);
SpannableString s = new SpannableString(liveitem.getTitle().toString());
s.setSpan(new ForegroundColorSpan(Color.RED), 0, s.length(), 0);
liveitem.setTitle(s);
但是什么也没发生!
如果我对溢出菜单的某个项目执行相同操作,它会起作用:
app:showAsAction="ifRoom|withText"项目是否有一些限制?有什么解决办法吗?
提前致谢。
最佳答案
这个聚会有点晚了,但我花了一段时间研究这个并找到了一个解决方案,它可能对其他尝试做同样事情的人有用。一些功劳归功于 Harish Sridharan 引导我朝着正确的方向前进。
您可以使用 findViewById(R.id.MY_MENU_ITEM_ID)
定位菜单项(前提是菜单已创建和准备好),并将其转换为 TextView
Harish 建议的实例,然后可以根据需要设置样式。
public class MyAwesomeActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
super.onCreate(savedInstanceState);
// Force invalidatation of the menu to cause onPrepareOptionMenu to be called
invalidateOptionsMenu();
}
private void styleMenuButton() {
// Find the menu item you want to style
View view = findViewById(R.id.YOUR_MENU_ITEM_ID_HERE);
// Cast to a TextView instance if the menu item was found
if (view != null && view instanceof TextView) {
((TextView) view).setTextColor( Color.BLUE ); // Make text colour blue
((TextView) view).setTextSize(TypedValue.COMPLEX_UNIT_SP, 24); // Increase font size
}
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
boolean result = super.onPrepareOptionsMenu(menu);
styleMenuButton();
return result;
}
}
这里的技巧是在 Activity 的 onCreate
事件中强制菜单无效(从而导致 onPrepareMenuOptions
比正常情况下更快地被调用)。在这个方法中,我们可以根据需要定位菜单项和样式。
关于android - 以编程方式更改 MenuItem 文本颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31713628/