6

Ich möchte verschiedene ActionBar Icons verwenden, je nachdem, welchen Stil ich verwende (Dark oder Light). Ich kann es nicht herausfinden, wie, heren, was ich versuchte:Ändern der ActionBar Menü Icons je nach Style

<style name="AppThemeDark" parent="Theme.Sherlock.ForceOverflow"> 
     <item name="android:actionButtonStyle">@style/customActionButtonStyleDark</item> 
     <item name="actionButtonStyle">@style/customActionButtonStyleDark</item> 
    </style> 

    <style name="AppThemeLight" parent="Theme.Sherlock.Light.ForceOverflow"> 
     <item name="android:actionButtonStyle">@style/customActionButtonStyleLight</item> 
     <item name="actionButtonStyle">@style/customActionButtonStyleLight</item> 
    </style> 

    <style name="customActionButtonStyleDark" > 
     <item name="@drawable/action_search">@drawable/action_search</item> 
    </style> 

    <style name="customActionButtonStyleLight" > 
     <item name="@drawable/action_search">@drawable/action_search_light</item> 
    </style> 

Ich habe auch versucht <item name="@drawable/action_search">@drawable/action_search</item> direkt in das Thema Stil einfügen, aber nichts funktionierte.
Irgendwelche Ideen wie?

Antwort

1

es wurde gelöst, aber gab es auf es mit XML, um zu versuchen, ich habe es programmatisch jetzt tat:

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     SharedPreferences prefs = getSharedPreferences("app", 0); 
     boolean isDark = "Dark".equals(prefs.getString("theme", "Dark")); 

     com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater(); 
     inflater.inflate(R.menu.main, menu); 

     // set Icons 
     menu.findItem(R.id.menuitem_search).setIcon(isDark ? R.drawable.action_search : R.drawable.action_search_light); 
     menu.findItem(R.id.menuitem_add).setIcon(isDark ? R.drawable.content_new : R.drawable.content_new_light); 
     menu.findItem(R.id.menuitem_share).setIcon(isDark ? R.drawable.social_share : R.drawable.social_share_light); 
     return true; 
    } 
2

Ich glaube, Sie nicht Thematisierung haben :) Wenn Sie versuchen zu tun:

<style name="customActionButtonStyleDark" > 
    <item name="@drawable/action_search">@drawable/action_search</item> 
</style> 

Sie versuchen, mit dem Namen etwas Attribut in Thema zu überfrachten „@ ziehbar/action_search“

Ich habe schlechte Nachrichten für dich, ich denke, es gibt keine solchen. So können Sie zum Thema Theme.Sherlock.ForceOverflow und seine Eltern gehen und sehen, was Sie überladen können.

Wenn nichts hilft, und Sie benutzerdefinierte Attribut in Ihrem Thema für verschiedene Symbole haben möchten, ist es ein anderes Thema. Sie müssen das Attribut in attrs.xml erstellen, die Symbolquelle auf dieses neue Attribut richten und den Attributwert im Design definieren. Für jeden anderen Knopf.

18

Auch wenn Sie eine Abhilfe gefunden, vielleicht ist dies jemand anderes helfen. Ich habe einen einfachen Weg gefunden, dies in xml zu tun (worauf sich die Antwort von logcat bezieht). Der Trick, den ich verwendet habe, war, benutzerdefinierte Attribute für meine Menü-/Aktionsleisten-Icons zu erstellen. Sie müssen ein Attribut pro Menüelementsymbol haben.

Sie müssen attrs.xml in Ihrem Ordner values erstellen und Ihre benutzerdefinierten Attribute hinzufügen. Stellen Sie sich jedes Attribut als eine Konstante vor, die von Ihren Designs/Stilen festgelegt wird, und dann können Ihre Stile/Ansichten diese contants verwenden, um Eigenschaften festzulegen.

<declare-styleable name="customAttrs"> 
    <attr name="customSearchIcon" format="reference" /> 
</declare-styleable> 

In Ihrem styles.xml in Ihrem values Ordner, haben Sie Ihre Themen/Stile, die Ihr eigenes Symbol drawable Referenzen Attribute zu setzen.

<style name="AppThemeDark" parent="Theme.Sherlock.ForceOverflow"> 
    <item name="customSearchIcon">@drawable/action_search</item> 
</style> 

<style name="AppThemeLight" parent="Theme.Sherlock.Light.ForceOverflow"> 
    <item name="customSearchIcon">@drawable/action_search_light</item> 
</style> 

schließlich in Ihrem [menu_name].xml in Ihrem menu Ordner, haben Sie Ihren Menüpunkt das entsprechende Symbol auf Ihr passendes benutzerdefiniertes Symbol Attribut gesetzt.

<item 
    android:id="@+id/menuitem_search" 
    android:icon="?attr/customSearchIcon"/> 

Nun wird, je nachdem, was Thema gesetzt ist, wird das Symbol für den Menüpunkt ändern. Außerdem können Sie API-spezifische Versionen Ihrer Zeichenvorlagen (hell und dunkel) verwenden, indem Sie Ressourcen-IDs mit Ihren Ordnern drawable verwenden. So können Sie verschiedene Menüstilsymbole für Pre 3.0- und Actionbar-Stilsymbole für 3.0+ verwenden.

Denken Sie auch daran, wenn Sie ein Design zur Laufzeit setzen (vs AndroidManifest.xml), müssen Sie es vor dem Aufruf setContentView() in Ihrem Activity setzen. Es wird empfohlen, die Aktivität nach dem Ändern des Themas einer Activity, die bereits erstellt wurde, neu zu starten.

+0

Es funktioniert gut, danke der! Aber wie benutzt man es von Java? Wenn ich menuLetters.setIcon (R.attr.ic_action_messages); Ich bekomme den Fehler, dass die Ressource nicht gefunden wurde. – BArtWell

+2

Gute Frage, ich denke die Antwort ist [hier] (http://stackoverflow.com/questions/8793183/access-resource-defined-in-theme-and-attr-xml-android). Der Trick scheint zu sein, dass Sie Android sagen müssen, welches Thema gerade eingestellt ist, damit es weiß, welche gestylte Ressource zu greifen ist. –

+0

Ja, Sie haben Recht, es funktioniert auch gut. Vielen Dank! – BArtWell

0

res/xml/ic_search.xml in Blog-Eintrag anzeigen AppCompat — Age of the vectors (Chris Barnes)

Hinweis der Verweis auf ?attr/colorControlNormal

<vector xmlns:android="..." 
    android:width="24dp" 
    android:height="24dp" 
    android:viewportWidth="24.0" 
    android:viewportHeight="24.0" 
    android:tint="?attr/colorControlNormal"> 
    <path 
     android:pathData="..." 
     android:fillColor="@android:color/white"/> 
</vector>