昨晚有人在群里问怎么动态修改menu的颜色
关键对方还说在网上百度了3个小时了,依然没有解决问题
我知道,轮到我出手了😀
如果你是复制粘贴党,那么下面的代码拿走即可👇
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
int itemId = item.getItemId();
for (int i = 0; i < toolBar.getChildCount(); i++) {
View childAt = toolBar.getChildAt(i);
if (childAt instanceof ActionMenuView) {
ActionMenuView itemView = (ActionMenuView) childAt;
for (int j = 0; j < itemView.getChildCount(); j++) {
ActionMenuItemView menuItemView = (ActionMenuItemView) itemView.getChildAt(j);
int id = menuItemView.getId();
if (itemId==id){
menuItemView.setTextColor(Color.BLUE);
}else {
menuItemView.setTextColor(Color.BLACK);
}
}
}
}
return super.onOptionsItemSelected(item);
}
如果你还想学习一点东西,可以从这里往下看
其实很简单
当时我也从网上随便搜索了一下,凭感觉没有发现比较靠谱的方案。只好自己去翻源码
我本来的思路是通过反射来更改文字颜色,但是在翻源码的过程中我发现如果我要精确的找到那个textView,这个工作量有点大了。
后来就想着,我只要搞清楚toolBar中的树形结构,然后找到显示menu文字的textView就行了。
既然要找toolBar的树形结构,那么遍历toolBar是最好的选择
在遍历过程中找到textView或者其子类,然后去改变文字的颜色,看看有没有效果。
省时省力省心。
代码遂成!
question:如果我们想默认选中某个menu,该怎么办捏?
福利代码,拿走不谢👇
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
Log.d(TAG, "onPrepareOptionsMenu: ");
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
for (int i = 0; i < toolBar.getChildCount(); i++) {
View childAt = toolBar.getChildAt(i);
if (childAt instanceof ActionMenuView) {
ActionMenuView itemView = (ActionMenuView) childAt;
for (int j = 0; j < itemView.getChildCount(); j++) {
ActionMenuItemView menuItemView = (ActionMenuItemView) itemView.getChildAt(j);
int id = menuItemView.getId();
if (id==R.id.menu_manage){
menuItemView.setTextColor(Color.BLUE);
}
}
}
}
}
}, 100);
return super.onPrepareOptionsMenu(menu);
}
网友评论