2013-01-07 11 views
26

Chciałbym niestandardowe tło & kolor tekstu dla mojego przepełnionego menu. Działa dobrze na urządzeniach bez sprzętowego przycisku menu, ale nie mogę stylizować urządzeń za pomocą przycisku menu sprzętowego. Zobacz zdjęcia:Jak stylizować tekst w menu przepełnienia akcji na urządzeniu z Androidem> 4.0 i przyciskiem sprzętowym?

Screnshot from Galaxy Nexus Screenshot from Galaxy S3

używam te style:

<style name="Theme.settleup" parent="@style/Theme.Sherlock.Light.DarkActionBar"> 
    <item name="android:popupMenuStyle">@style/settleup_PopupMenu</item> 
    <item name="android:actionMenuTextColor">@android:color/white</item> 
</style> 
<style name="settleup_PopupMenu" parent="@style/Widget.Sherlock.ListPopupWindow"> 
    <item name="android:popupBackground">@drawable/menu_dropdown_panel_settleup</item> 
</style> 

Odpowiedz

25

szukałem w problem. I wydaje się, że nie ma możliwości zmiany textColor dla menu opcji dla urządzeń z Androidem> = 4.0 z kluczem menu HW. Nawet zmiana kolorów podstawowych, drugorzędnych lub trzeciorzędnych nie wpłynęła na kolor tekstu.
Jedynym "rozwiązaniem", które przychodzi mi na myśl, jest dość nieprzyjemne użycie interfejsu API Java.

Można jednak ustawić tło menu dolnych opcji urządzeń z kluczem sprzętowym Android> = 4.0 HW oddzielnie od tła menu rozwijanego klucza innego niż HW.

Masz już styl dla menu rozwijanego z kluczem innym niż HW. Przycisk menu rozwijanego non-HW jest zdefiniowana przez android:popupMenuStyle (i popupMenuStyle):

<style name="Theme.settleup" parent="@style/Theme.Sherlock.Light.DarkActionBar"> 
    <item name="android:popupMenuStyle">@style/settleup_PopupMenu</item> 
</style> 

Ale tło Android> = 4.0 HW menu opcji klucz dolny jest zdefiniowana android:panelBackground elementu w temacie:

<style name="Theme.settleup" parent="@style/Theme.Sherlock.Light.DarkActionBar"> 
    <item name="android:panelBackground">@drawable/mybackground</item> 
</style> 

Ponieważ wydaje się, że problem z zmienianiem koloru tekstu dla menu opcji dolnych na urządzeniach klucza sprzętowego Android> = 4.0, sugerowałbym pozostawienie tej części do domyślnej stylizacji.

+0

Dzięki, to faktycznie rozwiązuje mój problem. Dolne menu nie musi być stylizowane, ponieważ nie jest wizualnie połączone z paskami akcji. –

+0

Udało mi się zmienić kolor na atrybut android: textAppearanceLargePopupMenu. Ustaw go w kompozycji aplikacji/działania, a następnie ustaw atrybut textColor w tym stylu. –

+0

@YoelGluschnaider jaki masz styl macierzysty dla swojego android: textAppearanceLargePopupMenu item? –

1

spróbować także dodawanie elementów bez android prefiksu

<style name="Theme.settleup" parent="@style/Theme.Sherlock.Light.DarkActionBar"> 
    <item name="android:popupMenuStyle">@style/settleup_PopupMenu</item> 
    <item name="popupMenuStyle">@style/settleup_PopupMenu</item> 
    <item name="android:actionMenuTextColor">@android:color/white</item> 
    <item name="actionMenuTextColor">@android:color/white</item> 
</style> 
<style name="settleup_PopupMenu" parent="@style/Widget.Sherlock.ListPopupWindow"> 
    <item name="android:popupBackground">@drawable/menu_dropdown_panel_settleup</item> 
    <item name="popupBackground">@drawable/menu_dropdown_panel_settleup</item> 
</style> 
+0

mam go tam tak usunąłem go w moim pytaniu dla jasności. Atrybuty AFAIK bez prefiksu Android są tylko dla emulowanego ActionBar <4.0. Ale mam problem z natywnym actionbar na urządzeniach z Androidem> = 4.0 (z menu sprzętowym). –

1

co można zrobić, jeśli naprawdę trzeba zmienić kolor tekstu w menu z prawej obraz może być następująca „hack”:

SpannableStringBuilder text = new SpannableStringBuilder(); 
     text.append("MenuItem1"); 
     text.setSpan(new ForegroundColorSpan(Color.WHITE), 0, text.length(), 
       Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

     menu.add(Menu.NONE, MENU_ITEM_1, Menu.NONE, null).setTitle(text); 

Zgadzam się, że nie jest to najczystszy sposób (Powiedziałbym jest to dość brzydkie, ponieważ musisz zwracać uwagę na każde działanie, w którym masz takie menu, a tytuł każdej pozycji menu musi zostać zmieniony przy użyciu tej logiki), ale jest to coś, co wyświetla oczekiwany wynik. Daj mi znać, jeśli ci to pomoże.

Pozdrawiam!

3

Możesz stosować style i motywy w Menu kontekstu przepełnienia, jak poniżej. OverFlow Menu to ListView, więc możemy zastosować motyw zgodnie z listview.

Zastosuj poniżej kod w styles.xml

<style name="AppTheme" parent="@android:style/Theme.Holo.Light"> 
    <item name="android:dropDownListViewStyle">@style/PopupMenuListView</item> 
      <item name="android:actionBarWidgetTheme">@style/PopupMenuTextView</item> 
      <item name="android:popupMenuStyle">@style/PopupMenu</item> 
      <item name="android:listPreferredItemHeightSmall">40dp</item> 
    </style> 

    <!-- Change Overflow Menu ListView Divider Property --> 
     <style name="PopupMenuListView" parent="@android:style/Widget.Holo.ListView.DropDown"> 
      <item name="android:divider">@color/app_navigation_divider</item> 
      <item name="android:dividerHeight">1sp</item> 
      <item name="android:listSelector">@drawable/list_selector</item> 
     </style> 

     <!-- Change Overflow Menu ListView Text Size and Text Size --> 
     <style name="PopupMenuTextView" parent="@android:style/Widget.Holo.Light.TextView"> 
      <item name="android:textColor">@color/app_white</item> 
      <item name="android:textStyle">normal</item> 
      <item name="android:textSize">18sp</item> 
      <item name="android:drawablePadding">25dp</item> 
      <item name="android:drawableRight">@drawable/navigation_arrow_selector</item> 
     </style> 

     <!-- Change Overflow Menu Background --> 
     <style name="PopupMenu" parent="android:Widget.Holo.Light.ListPopupWindow"> 
      <item name="android:popupBackground">@drawable/menu_overflow_bg</item> 
     </style> 
6

kopał w kategoryzacji AppCompat ale cokolwiek Próbowałem textColor pozostaje biały. Co mam teraz zrobić jest tylko popup menu Toolbar ręcznie tak:

@Override 
public boolean onKeyUp(int keycode, KeyEvent e) { 
    switch (keycode) { 
     case KeyEvent.KEYCODE_MENU: 
      if (getSupportActionBar() != null) { 
       getSupportActionBar().openOptionsMenu(); 

       return true; 
      } 
    } 

    return super.onKeyUp(keycode, e); 
} 

Naciśnięcie przycisku menu, gdy menu jest otwarte magicznie zamyka go.

Kto i tak potrzebuje brzydkiego menu z czarnym dołem?

+1

Dziękuję bardzo! Najlepsze rozwiązanie do tej pory. – rkyr

2

Dla AppCompat motyw:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    <item name="actionBarPopupTheme">@style/HardwareOptionMenu</item> 
</style> 

<style name="HardwareOptionMenu" parent="ThemeOverlay.AppCompat.Dark"> 
    <item name="android:textColorSecondary">@color/white</item> 
    <item name="android:colorBackground">@color/black</item> 
</style>