Подтвердить что ты не робот

Как удалить значки из меню переполнения ActionBarSherlock на Android 2.3?

У меня есть приложение с ActionBarSherlock с помощью темы Theme.Sherlock.Light.DarkActionBar. Панель действий темная, и мои значки меню светятся. Когда я запускаю свое приложение на небольших макетах, в меню переполнения отображаются 2 или 3 пункта меню со значками.

В Android 3+ элементы меню переполнения не будут отображаться на значках, но на Android 2.3 и ранее я вижу плитки меню с почти невидимыми значками, потому что цвет плитки белый, а значки близки к белым.

enter image description here

Как вы можете видеть, световые значки невидимы на белом фоне, но они должны иметь светлый цвет, который должен быть видимым на темной панели действий:

enter image description here

Можно ли удалить значки, когда пункты меню отображаются в меню переполнения?

4b9b3361

Ответ 1

Я также столкнулся с той же проблемой:

есть много способов добиться этого, а не удалять изображение:

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>

Для меня все 3 работали нормально

Надеюсь, это сработает и для вас.

Ответ 2

вы можете использовать квалификаторы конфигурации. например.

создать папку с возможностью копирования /res/drawable -v11/поместите в него все "светлые" значки.

а для более темных значков используйте /res/drawable/folder.

обязательно используйте те же имена файлов в обеих папках.

Надеюсь, я понял вашу проблему, и это может вам помочь.

Однако, если вы хотите изменить чертежи JUST для меню переполнения, я не думаю, что это возможно. Также потому, что иконы меню не предназначены для использования таким образом. ActionBarSherlock, вероятно, также вызван такими проблемами, как официальная библиотека.

Ответ 3

OS 2.x был беспорядок, поскольку фон меню опций мог быть черным или белым, в зависимости от устройства, без возможности узнать, что именно.

Простым решением было использование серых (# 888888) значков для Android 2.x и ниже и размещение ваших современных (ICS/JB) значков в папке v11 для современных устройств:

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

Конечно, это означает drawable-mdpi-v11, drawable-hdpi-v11 и т.д.

Ответ 4

Простая альтернатива добавлению целого набора повторяющихся темных значков для версий 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, по крайней мере, на некоторые более крупные экраны, или согласиться с тем, что они всегда переходят в переполнение.

Ответ 5

Другой вариант - удалить значки из элементов без действия в onPrepareOptionsMenu.

Идея состоит в том, чтобы использовать actionbarsherlock MenuItemImpl.isActionButton, чтобы выяснить, является ли каждый элемент элементом действия, а если не удалять значок. Это немного сложно, потому что onPrepareOptionsMenu вызывается (по крайней мере) дважды АБС - в первый раз, когда он создает панель действий, и в этом случае 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;

Это работает в АБС 4.3.0, но поскольку он использует внутренние классы библиотек, он может не работать с другими версиями библиотеки.