2013-05-02 2 views
7

Ich habe eine Navigationsliste in meiner Aktionsleiste, die einen dunklen Hintergrund hat. Das Pop-Menü hat jedoch einen weißen Hintergrund.ActionBar Liste Navigation: verschiedene Textfarbe in der Kopfzeile und Popup-Menü

Also was ich erreichen möchte, ist, dass der Artikel Textfarbe innerhalb der Aktionsleiste weiß ist, während die Elemente Textfarbe im Menü Pop-up sind schwarz.

Dies sind zwei Beispiele, was ich bisher habe:

bad examples

Dies ist, wie es aussehen sollte:

planned

Kennt jemand eine Lösung?

Dies ist mein Code für die Liste Navigation:

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) 

Dies ist eine Sammlung von Stilen, die ich gearbeitet.

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

Aber nichts hat nicht funktioniert.

+0

Wie hast du das gemacht? Kannst du einen Arbeitscode posten? –

+0

@ user2247689: Zur Zeit habe ich keinen Zugriff auf die Quellen. Im Grunde begann ich mit dem Vorschlag von * matthias *: zwei verschiedene Layouts anwenden und eigene Stile für sie festlegen (überschreiben von 'textAppearance'; siehe meinen Kommentar). Ich würde empfehlen, dass Sie sich ActionBarSherlock ansehen, da Sie die verknüpften Stilquellen schnell nachschlagen können. Später habe ich meine Implementierung auf die Lösung von * Android-Developer * umgestellt, weil ich in meiner App mehr als einen Spinner habe. – Trinimon

+0

Danke für die Antwort ... Ich habe die Sache zur Arbeit :) –

Antwort

12

Das Problem ist, dass Sie die gleiche Ressource android.R.layout.simple_dropdown_item_1line für die Spinner-Element und das Spinner Dropdown-Element verwenden.

Verwenden Sie stattdessen R.layout.sherlock_spinner_item und 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); 

Auf diese Weise werden die Stile wie Widget.Sherlock.TextView.SpinnerItem arbeiten.

+3

Dies wies mich in die richtige Richtung. Ich war mir nicht bewusst, die richtigen Layouts und (folglich) Stile anzuwenden. Ich habe es endlich mit den obigen Layouts ausgeführt und 'spinnerItemStyle' und' spinnerDropDownItemStyle' zum Hauptthema hinzugefügt. Die tatsächlichen Änderungen an Textfarbe und -größe können in abgeleiteten 'textAppearance'-Stilen vorgenommen werden.Vielen dank für Deine Hilfe! – Trinimon

5

Sie können dies erreichen, indem Sie einfach Ihr benutzerdefiniertes XML erstellen, das Ihr Listenelement sein wird. Erstellen Sie Ihre xml wie folgt aus: 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" /> 

und verwenden Sie es wie folgt aus:

adapter.setDropDownViewResource(R.layout.custom_list_item); 

, die den Trick tun sollte (zumindest funktioniert es in meine apps).

+0

das funktioniert super und ist definitiv ein wertvoller Hinweis insbesondere für die Fälle, in denen das Standardlayout nicht ausreicht. Ich bin jedoch mit dem vordefinierten Layout hier zufrieden. Danke für deine Antwort! – Trinimon

+0

Große Antwort für diejenigen, die nicht mit der Styles-Datei umgehen wollen! – 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> 

Sollte so sein. Ich weiß nicht warum mit dem Spinner "Item" Style @@

+0

Ich benutze ActionBarSherlock (siehe Tags oben). Inzwischen habe ich eine benutzerdefinierte Ansicht als _Android-Developer_ vorgeschlagen. Vielen Dank für Ihre Antwort :) – Trinimon

+0

Hope Sie können einige Tipps von AppCompat Thema Stil –

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

bekommen vergessen Sie nicht, zwei benutzerdefinierte Layout zu verwenden. –

Verwandte Themen