如何从ActionBar中删除图标夏洛克&x27;Android 2.3上的溢出菜单?

如何从ActionBar中删除图标夏洛克&x27;Android 2.3上的溢出菜单?,android,menu,icons,actionbarsherlock,Android,Menu,Icons,Actionbarsherlock,我有一个带有ActionBar Sherlock的应用程序,使用主题theme.Sherlock.Light.darkaActionBar。操作栏是黑色的,我的菜单图标是浅的。当我在小布局上运行我的应用程序时,溢出菜单中会显示2或3个带有图标的菜单项 在安卓3+上,溢出菜单项不会显示其图标,但在安卓2.3及更早版本上,我看到菜单平铺上几乎看不见图标,因为平铺颜色为白色,图标接近白色 如您所见,灯光图标在白色背景上不可见,但它们必须具有浅色,才能在深色操作栏上可见: 当溢出菜单中显示菜单项时,

我有一个带有
ActionBar Sherlock
的应用程序,使用主题
theme.Sherlock.Light.darkaActionBar
。操作栏是黑色的,我的菜单图标是浅的。当我在小布局上运行我的应用程序时,溢出菜单中会显示2或3个带有图标的菜单项

在安卓3+上,溢出菜单项不会显示其图标,但在安卓2.3及更早版本上,我看到菜单平铺上几乎看不见图标,因为平铺颜色为白色,图标接近白色

如您所见,灯光图标在白色背景上不可见,但它们必须具有浅色,才能在深色操作栏上可见:


当溢出菜单中显示菜单项时,是否可以删除图标?

您可以使用配置限定符。 e、 g

制作一个可绘制的文件夹 /res/drawable-v11/将所有“灯光”图标放入其中

对于较暗的图标,请使用 /res/drawable/folder

确保在两个文件夹中使用相同的文件名

我希望我已经理解了你的问题,这可能会对你有所帮助


但是,如果您只想更改溢出菜单的可绘制项,我认为这是不可能的。还因为菜单图标不打算这样使用。ActionBarSherlock可能也是因为这样的问题,而不是一个官方图书馆

我也面临同样的问题:

有许多方法可以实现这一点,而不是删除图像:

1) 您可以使用相应的可绘制文件夹来放置明暗图像

2) 您还可以通过检查设备版本,按菜单的代码更改背景色

如果您的设备不支持溢出菜单,则可以更改菜单的背景色,也可以更改菜单文本的颜色


我也面临同样的问题,并通过以下方法解决:

static final Class<?>[] constructorSignature = new Class[] {Context.class, AttributeSet.class};

class MenuColorFix implements LayoutInflater.Factory {
public View onCreateView(String name, Context context, AttributeSet attrs) {
    if (name.equalsIgnoreCase("com.android.internal.view.menu.ListMenuItemView")) {
        try {
            Class<? extends ViewGroup> clazz = context.getClassLoader().loadClass(name).asSubclass(ViewGroup.class);
            Constructor<? extends ViewGroup> constructor = clazz.getConstructor(constructorSignature);
            final ViewGroup view = constructor.newInstance(new Object[]{context,attrs});

            new Handler().post(new Runnable() {
                public void run() {
                    try {
                        view.setBackgroundColor(Color.BLACK);
                        List<View> children = getAllChildren(view);
                        for(int i = 0; i< children.size(); i++) {
                            View child = children.get(i);
                            if ( child instanceof TextView ) {
                                ((TextView)child).setTextColor(Color.WHITE);
                            }
                        }
                    }
                    catch (Exception e) {
                        Log.i(TAG, "Caught Exception!",e);
                    }

                }
            });
            return view;
        }
        catch (Exception e) {
            Log.i(TAG, "Caught Exception!",e);
        }
    }
    return null;
}       
}

public List<View> getAllChildren(ViewGroup vg) {
ArrayList<View> result = new ArrayList<View>();
for ( int i = 0; i < vg.getChildCount(); i++ ) {
    View child = vg.getChildAt(i);
    if ( child instanceof ViewGroup) {
        result.addAll(getAllChildren((ViewGroup)child));
    }
    else {
        result.add(child);
    }
}
return result;
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
LayoutInflater lInflater = getLayoutInflater();
if ( lInflater.getFactory() == null ) {
    lInflater.setFactory(new MenuColorFix());
}
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.myMenu, menu);
}
静态最终类[]构造函数签名=新类[]{Context.Class,AttributeSet.Class};
类MenuColorFix实现LayoutFlater.Factory{
创建视图的公共视图(字符串名称、上下文上下文、属性集属性){
if(name.equalsIgnoreCase(“com.android.internal.view.menu.ListMenuItemView”)){
试一试{

类OS2.x是一团乱麻,因为选项菜单背景可能是黑色或白色,这取决于设备,无法确定是哪个

简单的解决方法是在Android 2.x&under上使用灰色(#8888888)图标,并将您的现代(ICS/JB)图标放在现代设备的v11文件夹中:

drawable      // old school icons
drawable-v11  // modern icons

当然,这意味着drawable-mdpi-v11、drawable-hdpi-v11等等。

为2.x版本添加一整套重复的黑色图标的一个简单替代方法是从所有可以进入溢出菜单的项目中删除图标。例如:

res/菜单

<item
    android:id="@+id/menu_send_email"
    android:showAsAction="ifRoom"
    android:title="@string/menu_send_email"/>

当然,您需要使标题足够短,至少在一些较大的屏幕上可以放入操作栏,或者解决它们总是溢出的问题。

另一个选项是从OnPrepareOptions菜单中的非操作项中删除图标

我们的想法是使用actionbarsherlock的
MenuItemImpl.isActionButton
来确定每个项目是否是一个动作项目,如果不是,则删除图标。这有点棘手,因为调用了
OnPrepareOptions功能表
ABS两次-第一次构建操作栏时,在这种情况下,
menuitempl.isActionButton
尚未设置,将始终返回false。如果是这种情况,您希望不使用图标。构建操作栏后,
isActionButton
方法将为操作栏项返回true,为false否则。因此,您希望删除返回false的图标。这是我想到的:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
        boolean buildingOptionsMenu = false;
        for (int i=0; i<menu.size(); ++i) {
            MenuItemImpl mi = (MenuItemImpl)menu.getItem(i);
            if (mi.isActionButton()) {
                buildingOptionsMenu = true;
                break;
            }
        }

        if (buildingOptionsMenu) {
            for (int i=0; i<menu.size(); ++i) {
                MenuItemImpl mi = (MenuItemImpl)menu.getItem(i);
                if (!mi.isActionButton()) {
                    mi.setIcon(null);
                    mi.setIcon(0);
                }
            }               
        }
    }
    return super.onPrepareOptionsMenu(menu);
}

这在ABS 4.3.0中可以使用,但由于它使用内部库类,因此可能无法与其他版本的库一起使用。

可能您可以pst它的图片吗?@Kornitsevanatoloy doneI建议您将其发布在ABS问题页面上,因为这似乎是一个非常严重的错误。我的意思是,像这样,没有人想使用Light.DarkActionBar。这里有一个链接问题页面:您是否添加了自己的额外样式或配置?我希望溢出菜单项以与操作栏相同的颜色显示在垂直菜单中,因此是一个单列的深色菜单。ActionBar Sherlock在v11之前的设备上添加了一个操作栏,并且他仍然希望在这些设备上使用灯光图标,以便它能够在黑暗行动栏上移动。
<item
    android:id="@+id/menu_send_email"
    android:icon="@drawable/ic_action_send_email"
    android:showAsAction="ifRoom"
    android:title="@string/menu_send_email"/>
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
        boolean buildingOptionsMenu = false;
        for (int i=0; i<menu.size(); ++i) {
            MenuItemImpl mi = (MenuItemImpl)menu.getItem(i);
            if (mi.isActionButton()) {
                buildingOptionsMenu = true;
                break;
            }
        }

        if (buildingOptionsMenu) {
            for (int i=0; i<menu.size(); ++i) {
                MenuItemImpl mi = (MenuItemImpl)menu.getItem(i);
                if (!mi.isActionButton()) {
                    mi.setIcon(null);
                    mi.setIcon(0);
                }
            }               
        }
    }
    return super.onPrepareOptionsMenu(menu);
}
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.internal.view.menu.MenuItemImpl;