2013-02-28 2 views
13

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

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

enter image description here

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

enter image description here

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

+2

Возможно, вы можете сфотографировать его? –

+0

@ KorniltsevAnatoly done – Andrew

+0

Я предлагаю вам опубликовать это на странице проблем с ABS, поскольку это кажется очень плохой ошибкой. Я имею в виду, что никто не хочет использовать Light.DarkActionBar. Вот ссылка на страницу с вопросами: https://github.com/JakeWharton/ActionBarSherlock/issues – DominicM

ответ

2

Я также сталкиваюсь с теми же проблемами:

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

1) Вы можете использовать соответствующую Drawable папку поставить свет и темное изображение.

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

Надежда, это будет работать для вас, а

3

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

сделать выпадающую папку /res/drawable-v11/положить в нее все «легкие» значки.

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

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

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

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

+0

ActionBarSherlock добавляет панель действий на устройствах pre-v11, и он все еще хочет использовать световые значки на этих устройствах, чтобы он контрастировал с темной панелью действий. – Travis

0

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

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

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

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

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

0

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

Идея состоит в том, чтобы использовать actionbarsherlock's 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; 

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

Смежные вопросы