2013-02-28 9 views
13

Mam aplikację z ActionBarSherlock przy użyciu motywu Theme.Sherlock.Light.DarkActionBar. Pasek czynności jest ciemny, a moje ikony menu są lekkie. Gdy uruchomię swoją aplikację na małych układach, w menu przepełnienia wyświetlane są 2 lub 3 pozycje menu z ikonami.Jak usunąć ikony z menu przepełnienia ActionBarSherlock w systemie Android 2.3?

W systemie Android 3+ elementy menu z przepełnieniem nie będą wyświetlać swoich ikon, ale na Androidzie 2.3 i wcześniejszych widzę kafelki menu z prawie niewidocznymi ikonami, ponieważ kolor kafelka jest biały, a ikony bliskie są białym.

enter image description here

Jak widać, światło ikony są widoczne na białym tle, ale muszą mieć jasny kolor, aby były widoczne na ciemnym pasku akcji:

enter image description here

mogę usunąć ikony, gdy elementy menu są wyświetlane w menu przelewowym?

+2

może być zdjęcie, które można zobrazować? –

+0

@KorniltsevAnatoly done – Andrew

+0

Proponuję, aby opublikować to na stronie problemów ABS, ponieważ wydaje się, że jest to naprawdę zły błąd. Mam na myśli to, że nikt nie chce używać Light.DarkActionBar. Oto link do strony z problemami: https://github.com/JakeWharton/ActionBarSherlock/issues – DominicM

Odpowiedz

2

Byłem też w obliczu tego samego problemu:

istnieje wiele sposobów można to osiągnąć zamiast usuwania obrazu:

1) można użyć odpowiedniego folderu rozciągliwej umieścić światło i ciemny obraz.

2) Można również zmienić kolor tła według kodu menu, sprawdzając wersję urządzenia.

Jeśli urządzenie nie obsługuje menu przepełnienia, można zmienić kolor tła menu, a także zmienić kolor tekstu menu.

Byłem też w obliczu tego samego problemu i rozwiązać za pomocą następujących jeden:

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) zmiana koloru tła z pliku 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> 

Dla mnie wszystkie 3 pracował w porządku

Mam nadzieję, że to zadziała również dla Ciebie

3

możesz użyć kwalifikatorów konfiguracji. np.

utworzyć folder do rysowania /res/drawable-v11/umieścić wszystkie "lekkie" ikony w nim.

i dla ciemniejszych ikon użyj folderu /res/drawable /.

pamiętaj, aby używać tych samych nazw plików w obu folderach.

Mam nadzieję, że zrozumiałem Twój problem, a to może ci pomóc.

Jednakże, jeśli chcesz zmienić rysunki TYLKO dla menu przelewowego, nie sądzę, że jest to możliwe. Również dlatego, że ikony menu nie mają być używane w ten sposób. ActionBarSherlock jest prawdopodobnie również z powodu takich problemów, a nie z oficjalnej biblioteki.

+0

ActionBarSherlock dodaje pasek akcji na urządzeniach pre-v11 i nadal chce używać ikon światła na tych urządzeniach, aby kontrastował z ciemnym paskiem akcji. – Travis

0

OS 2.x był bałagan, ponieważ tło menu opcji może być czarne lub białe, w zależności od urządzenia, bez możliwości dowiedzenia się, które z pewnością.

Łatwy fix było używać szarych (# 888888) Ikony dla Android 2.x & pod i umieścić swoje nowoczesne (ICS/JB) ikony w folderze v11 dla nowoczesnych urządzeń:

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

Oczywiście to znaczy drawable-mdpi-v11, drawable-hdpi-v11 i tak dalej.

0

Prostą alternatywą dla dodawania całego zestawu zduplikowanych ciemnych ikon dla wersji 2.x może być po prostu usunięcie ikon ze wszystkich elementów, które mogą przejść do menu przepełnienia. Na przykład:

res/menu

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

res/menu-v11 (lub nawet res/menu-v9, bo 2,3 zazwyczaj ma ciemną menu)

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

Oczywiście, trzeba zrobić tytuły wystarczająco krótkie, aby pasowały do ActionBar przynajmniej na niektórych większych ekranach lub załóżmy, że zawsze wchodzą w przelew.

0

Inną opcją jest usunięcie ikon z elementów niedziałających w onPrepareOptionsMenu.

Chodzi o to, aby użyć pasków akcji MenuItemImpl.isActionButton, aby dowiedzieć się, czy każdy element jest elementem akcji, a jeśli nie, usunąć ikonę. Jest to nieco skomplikowane, ponieważ onPrepareOptionsMenu jest wywoływane (przynajmniej) dwukrotnie przez ABS - po raz pierwszy, gdy buduje pasek akcji, w którym to przypadku MenuItemImpl.isActionButton nie zostało jeszcze ustawione i zawsze zwróci false. Jeśli tak jest, chcesz pozostawić ikony w spokoju. Po utworzeniu paska akcji, metoda isActionButton zwróci wartość true dla elementów paska akcji, w przeciwnym razie false. Więc chcesz usunąć ikony dla tych, które zwracają fałsz. To właśnie wymyśliłem:

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

Musisz te dwa Import:

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

Działa to w ABS 4.3.0, ale ponieważ używa biblioteki klas wewnętrznych nie może pracować z inne wersje biblioteki.

Powiązane problemy