13

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

在 Android 3+ 上,溢出菜单项不会显示它们的图标,但在 Android 2.3 和更早版本上,我看到带有几乎不可见图标的菜单图块,因为图块颜色为白色,图标接近于白色。

在此处输入图像描述

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

在此处输入图像描述

当菜单项显示在溢出菜单中时,我可以删除图标吗?

4

5 回答 5

3

您可以使用配置限定符。例如

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

对于较暗的图标,请使用 /res/drawable/ 文件夹。

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

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

但是,如果您只想为溢出菜单更改可绘制对象,我认为这是不可能的。也因为菜单图标不打算这样使用。ActionBarSherlock 可能也是因为这样的问题,不是官方库。

于 2013-03-07T08:49:43.560 回答
2

我也面临同样的问题:

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

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);
}

3) 从 styles.xml 文件中更改背景颜色

<style name="Theme.MyTheme" parent="Theme.Sherlock.ForceOverflow">
    <item name="actionBarStyle">@style/Widget.MyTheme.ActionBar</item>
    <item name="android:actionBarStyle">@style/Widget.MyTheme.ActionBar</item>
</style>

<style name="Widget.MyTheme.ActionBar" parent="Widget.Sherlock.ActionBar">
    <item name="android:background">#ff000000</item>
    <item name="background">#ff000000</item>
</style>

对我来说,这三个都很好

希望,这也对你有用

于 2013-03-09T15:35:39.680 回答
1

另一种选择是从 onPrepareOptionsMenu 中的非操作项中删除图标。

这个想法是使用 actionbarsherlockMenuItemImpl.isActionButton来确定每个项目是否是一个操作项目,如果不是则删除图标。这有点棘手,因为onPrepareOptionsMenuABS 调用(至少)两次 - 第一次是在构建操作栏时,在这种情况下MenuItemImpl.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);
}

您将需要这两个导入:

import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.internal.view.menu.MenuItemImpl;

这适用于 ABS 4.3.0,但由于它使用内部库类,它可能不适用于其他版本的库。

于 2013-09-19T01:20:48.950 回答
0

OS 2.x 是一团糟,因为选项菜单背景可能是黑色或白色,具体取决于设备,无法确定哪个。

简单的解决方法是为 Android 2.x 及以下版本使用灰色 (#888888) 图标,并将现代 (ICS/JB) 图标放在现代设备的 v11 文件夹中:

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

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

于 2013-05-18T05:27:37.427 回答
0

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

res/menu

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

res/menu-v11(甚至res/menu-v9,因为 2.3 通常有一个深色菜单)

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

当然,您需要使标题足够短以至少在某些较大的屏幕上适合 ActionBar,或者接受它们总是进入溢出的事实。

于 2013-08-27T19:51:59.410 回答