问题:如果 MenuItem(或哪些 MenuItems)在 ActionBar 的溢出菜单中,有没有办法检查代码?我正在使用 ActionBarSherlock
我需要这个的原因是,如果有空间,我有一堆图标会显示在 ActionBar 中。我有一个全息黑暗主题,所以图标是为了适应它。
当菜单项被放入溢出菜单时,我的问题就出现了。在 Pre-Honeycomb 设备上,这意味着它们将在用户按下菜单按钮时显示。这个菜单的背景与我的 ActionBar 完全相反,我想要一组不同的图标来适应它。
问题:如果 MenuItem(或哪些 MenuItems)在 ActionBar 的溢出菜单中,有没有办法检查代码?我正在使用 ActionBarSherlock
我需要这个的原因是,如果有空间,我有一堆图标会显示在 ActionBar 中。我有一个全息黑暗主题,所以图标是为了适应它。
当菜单项被放入溢出菜单时,我的问题就出现了。在 Pre-Honeycomb 设备上,这意味着它们将在用户按下菜单按钮时显示。这个菜单的背景与我的 ActionBar 完全相反,我想要一组不同的图标来适应它。
我可能已经找到了解决这个问题的方法:在设计指南(此处)中,有一个表格显示了根据 dip 的宽度显示了多少操作栏项。
基于该表,我编写了以下代码:
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem search = menu.findItem(R.id.menu_search);
// Get width in dp
DisplayMetrics metrics = new DisplayMetrics();
Display display = getWindowManager().getDefaultDisplay();
display.getMetrics(metrics);
float logicalDensity = metrics.density;
int dp = (int) (display.getWidth() / logicalDensity + 0.5);
if (dp < 360) { // only two icons
search.setIcon(R.drawable.ic_menu_search); // Show menu icon for pre-3.0 menu
} else {
search.setIcon(R.drawable.ic_action_search); // Show action bar icon for action bar
}
return true;
}
我发布了一个类似问题的答案,可以解决您的问题,请参阅:
https://stackoverflow.com/a/18884872/1299562
基本上您可以使用 onPrepareOptionsMenu 删除非操作项图标。
您可以使用反射。将以下代码放在一个类中,然后调用Foo.isInOverflow(yourMenuItem);
protected static final String SUPPORTCLASS = "android.support.v7.internal.view.menu.MenuItemImpl";
protected static final String NATIVECLASS = "com.android.internal.view.menu.MenuItemImpl";
protected static Method sSupportIsActionButton;
protected static Method sNativeIsActionButton;
static {
try {
Class<?> MenuItemImpl = Class.forName(NATIVECLASS);
sNativeIsActionButton = MenuItemImpl.getDeclaredMethod("isActionButton");
sNativeIsActionButton.setAccessible(true);
} catch (Exception ignored) {
}
try {
Class<?> MenuItemImpl = Class.forName(SUPPORTCLASS);
sSupportIsActionButton = MenuItemImpl.getDeclaredMethod("isActionButton");
sSupportIsActionButton.setAccessible(true);
} catch (Exception ignored) {
}
}
// --------------------------------------------------------------------------------------------
/**
* Check if an item is showing (not in the overflow menu).
*
* @param item
* the MenuItem.
* @return {@code true} if the MenuItem is visible on the ActionBar.
*/
public static boolean isActionButton(MenuItem item) {
switch (item.getClass().getName()) {
case SUPPORTCLASS:
try {
return (boolean) sSupportIsActionButton.invoke(item, (Object[]) null);
} catch (Exception e) {
// fall through
}
case NATIVECLASS:
try {
return (boolean) sNativeIsActionButton.invoke(item, (Object[]) null);
} catch (Exception e) {
// fall through
}
default:
return true;
}
}
/**
* Check if an item is in the overflow menu.
*
* @param item
* the MenuItem
* @return {@code true} if the MenuItem is in the overflow menu.
* @see #isActionButton(MenuItem)
*/
public static boolean isInOverflow(MenuItem item) {
return !isActionButton(item);
}
注意:您需要将以下行添加到您的 proguard 配置文件中,以便反射在生产构建中起作用:
-keep public class android.support.v7.internal.view.menu.** { *; }
如果您使用的是,Toolbar
那么您可以在其中创建一个简单的扩展Kotlin
或静态函数,Java
以查找工具栏菜单项是在工具栏上可见还是隐藏在溢出选项菜单中。
这是一个示例函数,它的用途:
fun Toolbar.isMenuItemOverflowing(@IdRes id: Int): Boolean {
return this.findViewById<View>(id) == null
}
使用工具栏实例的功能: -
toolbar.isMenuItemOverflowing(R.id.action_search)