2012-10-06 13 views
6

voglio utilizzare diversi ActionBar icone a seconda di quale stile che uso (Dark o Light). non riuscivo a capire come, ecco quello che ho provato:Change ActionBar icone del menu a seconda dello stile

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

Ho provato anche a inserire <item name="@drawable/action_search">@drawable/action_search</item> direttamente nello stile tema, ma niente ha funzionato.
Qualche idea come?

risposta

1

risolto, ma ha dato fino a provare con XML, l'ho fatto ora di programmazione:

@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

penso che non hai tematizzazione :) Quando si sta cercando di fare:

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

Si sta cercando di sovraccaricare qualche attributo in tema con il nome "@ drawable/action_search"

ho cattive notizie per te, penso che non ci sia. Quindi puoi andare al tema Theme.Sherlock.ForceOverflow e sono i genitori e vedere cosa puoi sovraccaricare.

Se si, e si desidera avere attributo personalizzato in tema di icone diverse, E 'argomento diverso niente di aiuto. Devi creare un attributo in attrs.xml, indirizzare l'origine dell'icona a questo nuovo attributo e definire il valore dell'attributo nel tema. Per ogni pulsante diverso.

18

Anche se hai trovato una soluzione, forse ciò contribuirà a qualcun altro. Ho trovato un modo semplice per farlo in xml (a cui si riferisce la risposta di logcat). Il trucco che ho usato è stato quello di creare attributi personalizzati per le mie icone menu/barra delle azioni. Devi avere un attributo per icona della voce di menu.

È necessario creare attrs.xml nella cartella values e aggiungere gli attributi personalizzati. Pensa a ciascun attributo come a una costante impostata per i tuoi temi/stili, quindi i tuoi stili/viste possono utilizzare tali contant per impostare le proprietà.

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

Nella tua styles.xml nella cartella values, hanno i vostri temi/stili che impostare il proprio icona personalizzata attribuisce a drawable riferimenti.

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

Infine, nel vostro [menu_name].xml nella cartella menu, avere il vostro voce di menu impostata la sua icona al vostro corrispondente attributo icona personalizzata.

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

Ora, a seconda di quale tema è impostato, l'icona per la voce di menu cambierà. Inoltre, questo ti permette di avere ancora versioni specifiche dell'API dei tuoi drawable (chiari e scuri) usando gli identificatori di risorse con le tue cartelle drawable, così puoi avere icone di stile di menu differenti per 3.0 e icone di stile barra di azione per 3.0+.

Inoltre, ricordare quando si imposta un tema in fase di esecuzione (vs AndroidManifest.xml), è necessario impostarlo prima di chiamare setContentView() nel numero Activity. Si consiglia di riavviare l'attività dopo aver modificato il tema di uno Activity che è già stato creato.

+0

Si sta lavorando bene, grazie di! Ma come usarlo da Java? Quando chiamo menuLetters.setIcon (R.attr.ic_action_messages); Ottengo l'errore che la risorsa non è stata trovata. – BArtWell

+2

Buona domanda, penso che la risposta sia [qui] (http://stackoverflow.com/questions/8793183/access-resource-defined-in-theme-and-attrs-xml-android). Il trucco sembra essere che devi dire ad Android quale tema è attualmente impostato, in modo che sappia quale risorsa stilosa da afferrare. –

+0

Sì, hai ragione, funziona anche bene. Grazie! – BArtWell

0

Vedi res/xml/ic_search.xml nel post sul blog AppCompat — Age of the vectors (Chris Barnes)

Avviso il riferimento alla ?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> 
Problemi correlati