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

android-溢出菜单和子菜单中的色调菜单图标,第1张

概述我设法在工具栏的溢出菜单和子菜单中显示图标,但找不到如何根据图标的位置对其进行着色的方法.这是我正在使用的代码:@OverridepublicbooleanonCreateOptionsMenu(Menumenu){getMenuInflater().inflate(R.menu.toolbar_main,menu);//Showiconsinoverflowmen

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

@OverrIDepublic 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-溢出菜单和子菜单中的色调菜单图标全部内容,希望文章能够帮你解决android-溢出菜单和子菜单中的色调菜单图标所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1081368.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存