2012-02-02 15 views
15

Ho un colore di accento che utilizzo attraverso i miei layout. Lo ho definito come uno stile che applico a un TextView.Impostazione di un colore basato sul tema

La mia applicazione consente all'utente di scegliere tra un tema scuro e un tema leggero. Vorrei modificare il colore dell'accento in base al tema selezionato.

  • Non è possibile definire un colore in un tema
  • non si può definire un colore lista di stato in base a tema
  • Non è possibile risorse separati in base a tema (come si può per la versione o dimensioni dello schermo)
  • non è possibile aggiornare il colore di risorse dal codice (??? non al 100% su questo ???)

Come devo controllare il mio colore accento sulla base del tema selezionato?

La guida dev fornisce un esempio di un tema utilizzando un colore personalizzato, che è vicino a quello che voglio. Devo essere in grado di cambiare il colore in fase di esecuzione. So che potrei entrare nel mio codice e nei posti X in cui viene utilizzato questo stile potrei estrarre il componente e impostare il colore in questo modo. Ma penserei che potrei realizzare questo con una certa combinazione di stile/tema.

Grazie

risposta

0

Il modo in cui ho risolto questo era di creare sottoclassi della android.widget.TextView. Ho creato TextViewAccented e TextViewWarning. Io uso queste TextViews nel mio XML dove voglio il colore dell'accento o dell'avviso. Rimuovo tutti i riferimenti di colore dall'XML.

Le sottoclassi contengono i tre costruttori predefiniti. Tutti e tre i costruttori chiamano un metodo privato chiamato setColor(). setColor() quindi ispeziona il tema selezionato e può utilizzare la sfumatura desiderata in base al tema attualmente selezionato.

È un meccanismo abbastanza pulito, ma è difficile credere che non possa codificarlo in un tema. Sembra esattamente a cosa dovrebbe servire un tema.

23

Ho faticato con la stessa domanda ed ero vicino a fare qualcosa di simile a quello che ti è venuto in mente, ma fortunatamente ho trovato la seguente soluzione che ho anche dichiarato here.

In primo luogo si definiscono i campi di colore personalizzate in attr.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 

<attr name="titleColor" format="reference|color" /> 
<attr name="introColor" format="reference|color" /> 

</resources> 

Poi si definiscono i tuoi temi

<style name="AppTheme.MyLight" parent="android:Theme"> 
    <item name="titleColor">#FFFFFF</item> 
    <item name="introColor">#FFFFAA</item> 
</style> 


<style name="AppTheme.MyDark" parent="android:Theme"> 
    <item name="titleColor">#000000</item> 
    <item name="introColor">#004444</item> 
</style> 

e, infine, nel layout

<TextView 
    android:id="@+id/quoteTitle" 
    android:textColor="?titleColor" 
    ... 
</TextView> 

<TextView 
    android:id="@+id/quoteIntro" 
    android:textColor="?introColor" 
    ... 
</TextView> 

Sembra che ci sia nessuna spiegazione nella documentazione ufficiale di Android sull'utilizzo degli attributi. La migliore risorsa che ho trovato è here.

Problemi correlati