其他分享
首页 > 其他分享> > android-溢出菜单和子菜单中的色调菜单图标

android-溢出菜单和子菜单中的色调菜单图标

作者:互联网

我设法在工具栏的溢出菜单和子菜单中显示图标,但找不到如何根据图标的位置对其进行着色的方法.这是我正在使用的代码:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.toolbar_main, menu);

    // Show icons in overflow menu
    if (menu instanceof MenuBuilder) {
        MenuBuilder m = (MenuBuilder) menu;
        m.setOptionalIconsVisible(true);
    }

    // Change icons color
    changeIconsColor(menu, colorNormal, colorInMenu, false);

    return super.onCreateOptionsMenu(menu);
}

public static void changeIconsColor(Menu menu, int colorNormal, int colorInMenu, boolean isInSubMenu) {
    // Change icons color
    for (int i = 0; i < menu.size(); i++) {
        MenuItem item = menu.getItem(i);
        Drawable icon = item.getIcon();
        if (icon != null) {
            int color = (((MenuItemImpl) item).requiresActionButton() ? colorNormal : colorInMenu);
            icon.setColorFilter(color, PorterDuff.Mode.SRC_IN);
            icon.setAlpha(item.isEnabled() ? 255 : 128);
        }

        if (item.hasSubMenu()) {
            changeIconsColor(item.getSubMenu(), colorNormal, colorInMenu, true);
        }
    }
}

使用MenuItem.requiresActionButton()可以知道某个项目在XML的showAsAction属性中是否具有从不或始终具有值,但不知道其是否具有ifRoom值.因此,如果我想要适当的着色,则不能在项目中使用ifRoom值,这是非常严格的.

>是否有一种方法可以在所有情况下正确着色菜单项?
>更重要的是,是否有一种内置的方法可以为主题或样式着色项,从而使我不必使用此复杂代码?即使解决方案不包含溢出菜单中的图标,我也想知道.

如果没有其他方法,我会很好地使用反射.

解决方法:

不幸的是,无法使用主题或样式来设置菜单项图标颜色的色调.您需要一种方法来检查MenuItem在ActionBar或溢出菜单中是否可见.本机和支持MenuItemImpl类都具有用于此目的的方法,但它们仅限于库或隐藏.这需要反思.您可以使用以下方法检查菜单项是否可见,然后设置滤色器:

public static boolean isActionButton(@NonNull MenuItem item) {
  if (item instanceof MenuItemImpl) {
    return ((MenuItemImpl) item).isActionButton();
  } else {
    // Not using the support library. This is a native MenuItem. Reflection is needed.
    try {
      Method m = item.getClass().getDeclaredMethod("isActionButton");
      if (!m.isAccessible()) m.setAccessible(true);
      return (boolean) m.invoke(item);
    } catch (Exception e) {
      return false;
    }
  }
}

您还需要等到菜单膨胀后再对项目进行着色.为此,您可以获取对ActionBar的引用,并在绘制ActionBar之后给MenuItem着色.

例:

@Override public boolean onCreateOptionsMenu(Menu menu) {
  getMenuInflater().inflate(R.menu.menu_main, menu);

  int id = getResources().getIdentifier("action_bar", "id", "android");
  ViewGroup actionBar;
  if (id != 0) {
    actionBar = (ViewGroup) findViewById(id);
  } else {
    // You must be using a custom Toolbar. Use the toolbar view instead.
    // actionBar = yourToolbar
  }

  actionBar.post(new Runnable() {
    @Override public void run() {
      // Add code to tint menu items here 
    }
  });

  return super.onCreateOptionsMenu(menu);
}

这是我编写的帮助为菜单项图标着色的课程:https://gist.github.com/jaredrummler/7816b13fcd5fe1ac61cb0173a1878d4f

标签:android-actionbar,android-menu,android
来源: https://codeday.me/bug/20191108/2010514.html