2013-05-02 11 views
7

Mam pasek nawigacyjny w moim pasku akcji, który ma ciemne tło. Menu pop ma jednak białe tło.Nawigacja na liście ActionBar: inny kolor tekstu w nagłówku i menu wyskakującym

Więc chcę uzyskać to, że kolor tekstu pozycji na pasku akcji jest biały, podczas gdy kolor tekstu pozycji w menu jest czarny.

To są dwa przykłady, co mam tak daleko:

bad examples

To jak to powinno wyglądać:

planned

Czy ktoś zna rozwiązanie?

To jest mój kod do nawigacji listy:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
     android.R.layout.simple_dropdown_item_1line, new String[] { "Item 1", "Item 2" }); 

getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 
getSupportActionBar().setListNavigationCallbacks(adapter, 
     new ActionBar.OnNavigationListener() { 
      @Override 
      public boolean onNavigationItemSelected(int itemPosition, long itemId) { 
       return true; 
      } 
     }); 

getSupportActionBar().setSelectedNavigationItem(0) 

Są to zbiór stylów, z którymi pracowałem.

<style name="CustomTheme" parent="@style/Theme.customized"> 
     <item name="actionBarStyle">@style/Widget.Styled.ActionBar</item> 
     <item name="android:actionBarStyle">@style/Widget.Styled.ActionBar</item> 
     <item name="actionDropDownStyle">@style/CustomSherlockDropDownNav</item> 
     <item name="android:actionDropDownStyle">@style/CustomSherlockDropDownNav</item> 

     <!-- didn't work: http://stackoverflow.com/questions/12395381/android-actionbar-navigation-spinner-text-color   
     <item name="android:spinnerDropDownItemStyle">@style/custom.Widget.DropDownItem.Spinner</item> 
     <item name="spinnerDropDownItemStyle">@style/custom.Widget.DropDownItem.Spinner</item> 
     --> 

     <!-- didn't work: http://stackoverflow.com/questions/11479186/styling-actionbar-dropdown-menu 
     <item name="android:actionBarWidgetTheme">@style/custom.actionBarWidgetTheme</item> 
     <item name="actionBarWidgetTheme">@style/custom.actionBarWidgetTheme</item> 
     --> 

     <!-- didn't work: http://android-developers.blogspot.de/2011/04/customizing-action-bar.html                   
     <item name="android:dropDownListViewStyle">@style/CustomDropDownListView</item> 
     <item name="dropDownListViewStyle">@style/CustomDropDownListView</item> 
     --> 

     .... 
</style> 


<style name="custom.actionBarWidgetTheme" parent="@style/Theme.Sherlock.Light.DarkActionBar"> 
    <item name="android:spinnerDropDownItemStyle">@style/custom.Widget.DropDownItem.Spinner</item> 
</style> 

<style name="custom.Widget.DropDownItem.Spinner" parent="@style/Widget.Sherlock.DropDownItem.Spinner"> 
    <item name="android:textAppearance">@style/custom.TextAppearance.Widget.DropDownItem</item> 
</style> 

<style name="custom.TextAppearance.Widget.DropDownItem" parent="@style/TextAppearance.Sherlock.Widget.DropDownItem"> 
    <item name="android:textColor">#00A000</item> 
</style> 


<style name="CustomDropDownListView" parent="android:style/Widget.Holo.ListView.DropDown"> 
    <item name="android:textColor">#00A000</item> 
    <item name="android:textSize">8dip</item> 
</style> 


<style name="CustomSherlockDropDownNav" parent="@style/Widget.Sherlock.Light.Spinner.DropDown.ActionBar"> 
     <item name="android:popupBackground">@drawable/menu_dropdown_panel_customtab</item> 
     <item name="android:background">@drawable/spinner_background_ab_customtab</item> 
</style> 

Jednak nic nie zadziałało.

+0

jak to zrobiłeś? czy możesz opublikować działający kod? –

+0

@ user2247689: obecnie nie mam dostępu do źródeł. Zasadniczo zacząłem od tego, co * matthias * zaproponował: stosowanie dwóch różnych układów i ustawianie dla nich niestandardowych stylów (przesłonięcie 'textAppearance', zobacz mój komentarz). Polecam, aby rzucić okiem na ActionBarSherlock, ponieważ możesz szybko wyszukać powiązane źródła stylów. Później zmieniłem moją implementację na rozwiązanie * Android-Developer *, ponieważ mam więcej niż jedną 'Spinner' w mojej aplikacji. – Trinimon

+0

Dzięki za odpowiedź ... Mam coś do roboty :) –

Odpowiedz

12

Problem polega na tym, że używasz tego samego zasobu android.R.layout.simple_dropdown_item_1line dla elementu pokrętła i elementu rozwijanego pokrętła.

Zamiast tego należy użyć R.layout.sherlock_spinner_item i R.layout.sherlock_spinner_dropdown_item.

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
     R.layout.sherlock_spinner_item, new String[] { "Item 1", "Item 2" }); 
adapter.setDropDownViewResource(R.layout.sherlock_spinner_dropdown_item); 

W ten sposób będą działać style takie jak Widget.Sherlock.TextView.SpinnerItem.

+3

To wskazało mi właściwy kierunek. Nie zdawałem sobie sprawy z właściwych układów i (w konsekwencji) stylów do zastosowania. W końcu udało mi się uruchomić z powyższymi układami i dodać do motywu "spinnerItemStyle" i "spinnerDropDownItemStyle". Rzeczywiste zmiany w kolorze i rozmiarze tekstu mogą być wykonane w pochodnych stylach 'textAppearance'.Bardzo dziękuję za Twoją pomoc! – Trinimon

5

Możesz to osiągnąć, tworząc niestandardowy plik xml, który będzie elementem listy. Utworzyć xml tak: custom_list_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    style="?android:attr/spinnerDropDownItemStyle" 
    android:singleLine="true" 
    android:textSize="18sp" 
    android:textColor="@color/holo_dark_red" 
    android:paddingRight="110dip" 
    android:layout_width="match_parent" 
    android:layout_height="?attr/dropdownListPreferredItemHeight" 
    android:textIsSelectable="false" 
    android:ellipsize="marquee" /> 

i używać go tak:

adapter.setDropDownViewResource(R.layout.custom_list_item); 

To powinno załatwić sprawę (przynajmniej to działa w moich aplikacjach).

+0

działa to świetnie i jest zdecydowanie cenną wskazówką w szczególności w przypadkach, w których standardowy układ nie jest wystarczający. Jednak jestem zadowolony z wcześniej zdefiniowanego układu tutaj. Dzięki za odpowiedź! – Trinimon

+0

Świetna odpowiedź dla tych, którzy nie chcą zajmować się plikiem stylów! – ryvianstyron

1
<style name="Theme.WhyCheck" parent="@style/Theme.AppCompat.Light"> 
<item name="android:spinnerItemStyle">@style/DropDownNav.Item.Inverse</item> 
</style> 

<style name="DropDownNav.Item.Inverse" parent="@style/Widget.AppCompat.DropDownItem.Spinner"> 
    <item name="android:textAppearance">@style/ActionBar.TitleText</item> 
</style> 

<style name="ActionBar.TitleText" parent="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"> 
    <item name="android:fontFamily">sans-serif-light</item> 
    <item name="android:textColor">@color/white</item> 
</style> 

Powinno być takie. Nie wiem, dlaczego używasz pokrętła "Pozycja" Styl @@

+0

Używam ActionBarSherlock (zobacz tagi powyżej). Tymczasem zaimplementowałem niestandardowy widok jako sugerowany _Android-Developer_. Dziękuję za odpowiedź :) – Trinimon

+0

Nadzieję, że możesz uzyskać wskazówki w stylu motywu AppCompat –

0
  @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 


     // Inflating the layout for the custom Spinner 
     LayoutInflater inflater = getLayoutInflater(); 
     View layout = inflater.inflate(R.layout.custom, null); 

     // Declaring and Typecasting the textview in the inflated layout 
     TextView tvLanguage = (TextView) layout 
     .findViewById(R.id.tvLanguage); 

     // Setting the text using the array 
     tvLanguage.setText(obj[position]); 

     //tvLanguage.setTextColor(Color.BLACK); 
     tvLanguage.setTextSize(14f); 




     return layout; 

    } 
    @Override 
    public View getDropDownView(int position, View convertView, 
      ViewGroup parent) { 
     // TODO Auto-generated method stub 


     LayoutInflater inflater = getLayoutInflater(); 
     View layout = inflater.inflate(R.layout.customdropdown, null); 

     // Declaring and Typecasting the textview in the inflated layout 
     TextView tvLanguage = (TextView) layout 
     .findViewById(R.id.tvLanguage); 

     // Setting the text using the array 
     tvLanguage.setText(obj[position]); 

     //tvLanguage.setTextColor(Color.BLACK); 
     tvLanguage.setTextSize(14f); 



     return layout; 
    } 

} 
+0

nie zapomnij użyć dwóch niestandardowych układów. –