2013-05-02 12 views
7

Ho una lista di navigazione nella mia barra delle azioni con uno sfondo scuro. Il menu pop, tuttavia, ha uno sfondo bianco.Navigazione nella lista delle azioni: colore del testo diverso nell'intestazione e menu di scelta rapida

Quindi, ciò che voglio ottenere è che il colore del testo dell'elemento all'interno della barra delle azioni sia bianco mentre il colore del testo delle voci nel menu a comparsa sia nero.

Questo sono due esempi quello che ho ottenuto finora:

bad examples

Questo è come dovrebbe essere simile:

planned

Qualcuno sa una soluzione?

Questo è il mio codice per la lista di navigazione:

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) 

Queste è una raccolta di stili con cui ho lavorato.

<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> 

Tuttavia, non ha funzionato.

+0

come hai fatto? puoi pubblicare un codice funzionante? –

+0

@ user2247689: attualmente non ho accesso ai sorgenti. Fondamentalmente ho iniziato con ciò che * matthias * ha proposto: applicare due layout diversi e impostare stili personalizzati per loro (ignorando 'textAppearance', vedi il mio commento). Ti consiglio di dare un'occhiata a ActionBarSherlock, perché puoi cercare rapidamente le fonti di stile collegate. Più tardi ho cambiato la mia implementazione con la soluzione di * Android-Developer *, perché ho più di uno 'Spinner' nella mia app. – Trinimon

+0

Grazie per la risposta ... Ho fatto funzionare la cosa :) –

risposta

12

Il problema è che si sta utilizzando la stessa risorsa android.R.layout.simple_dropdown_item_1line per l'oggetto spinner e l'elemento a discesa dello spinner.

Utilizzare R.layout.sherlock_spinner_item e R.layout.sherlock_spinner_dropdown_item invece.

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

In questo modo, gli stili come Widget.Sherlock.TextView.SpinnerItem funzionerà.

+3

Questo mi ha indirizzato nella giusta direzione. Non ero a conoscenza dei giusti layout e (di conseguenza) stili da applicare. L'ho finalmente eseguito con i layout sopra e aggiungendo 'spinnerItemStyle' e' spinnerDropDownItemStyle' al tema principale. Le effettive modifiche al colore e alle dimensioni del testo possono essere eseguite in stili 'textAppearance' derivati.Grazie mille per il vostro aiuto! – Trinimon

5

È possibile ottenere questo semplicemente creando il tuo xml personalizzato che sarà il tuo oggetto della lista. Crea il tuo xml come questo: 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" /> 

e usarlo in questo modo:

adapter.setDropDownViewResource(R.layout.custom_list_item); 

Questo dovrebbe fare il trucco (almeno è lavorare nel mio apps).

+0

funziona molto bene ed è sicuramente un suggerimento prezioso in particolare per quei casi in cui il layout standard non è sufficiente. Tuttavia, sono soddisfatto del layout predefinito qui. Grazie per la tua risposta! – Trinimon

+0

Ottima risposta per coloro che non vogliono avere a che fare con il file di stili! – 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> 

Dovrebbe essere così. Non so perché usare lo stile "Articolo" filatore @@

+0

Uso ActionBarSherlock (vedere i tag sopra). Nel frattempo ho implementato una visualizzazione personalizzata come suggerito da _Android-Developer_. Grazie per la risposta però :) – Trinimon

+0

Spero che tu possa ottenere alcuni suggerimenti dallo stile di tema 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

non dimenticare di utilizzare due layout personalizzati. –

Problemi correlati