Gli stili e i temi su Android ti consentono di separare i dettagli del design dell'app dalla struttura e dal comportamento dell'interfaccia utente, in modo simile ai fogli di stile nel web design.
Uno stile è una raccolta di attributi che specifica l'aspetto di un singolo
View
. Uno stile può specificare attributi come colore del carattere, dimensione del carattere, colore di sfondo e molto altro.
Un tema è un insieme di attributi che viene applicato a un'intera gerarchia di app, attività o visualizzazioni, non solo a una singola visualizzazione. Quando applichi un tema, ogni visualizzazione nell'app o nell'attività applica tutti gli attributi del tema supportati. I temi possono applicare stili anche a elementi non visualizzati, come la barra di stato e lo sfondo della finestra.
Gli stili e i temi vengono dichiarati in un
file di risorse di stile in
res/values/
, di solito denominato styles.xml
.
Temi e stili
I temi e gli stili hanno molte somiglianze, ma vengono utilizzati per scopi diversi. I temi e gli stili hanno la stessa struttura di base: una coppia chiave-valore che mappa gli attributi alle risorse.
Un style specifica gli attributi per un determinato tipo di visualizzazione. Ad esempio, uno stile potrebbe specificare gli attributi di un pulsante. Ogni attributo specificato in uno stile è un attributo che puoi impostare nel file di layout. L'estrazione di tutti gli attributi in uno stile li rende facili da utilizzare e gestire su più widget.
Un tema definisce una raccolta di risorse denominate a cui è possibile fare riferimento da stili, layout,
widget e così via. I temi assegnano nomi semantici, come colorPrimary
, alle risorse Android.
Gli stili e i temi sono pensati per funzionare insieme. Ad esempio, potresti avere uno stile che specifica
che una parte di un pulsante è colorPrimary
e un'altra parte è
colorSecondary
. Le definizioni effettive di questi colori sono fornite nel tema. Quando il dispositivo passa alla modalità notturna, l'app può passare dal tema "chiaro" a quello "scuro", modificando i valori di tutti i nomi delle risorse. Non è necessario modificare gli stili, poiché utilizzano i nomi semantici e non definizioni di colore specifiche.
Per ulteriori informazioni sull'interazione tra temi e stili, consulta il post del blog Stili Android: temi e stili.
Creare e applicare uno stile
Per creare un nuovo stile, apri il file res/values/styles.xml
del progetto. Per ogni stile che vuoi creare, segui questi passaggi:
- Aggiungi un elemento
<style>
con un nome che identifichi in modo univoco lo stile. - Aggiungi un elemento
<item>
per ogni attributo di stile che vuoi definire. Il caratterename
in ogni elemento specifica un attributo che altrimenti utilizzeresti come attributo XML nel layout. Il valore nell'elemento<item>
è il valore dell'attributo.
Ad esempio, supponi di definire il seguente stile:
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="GreenText" parent="TextAppearance.AppCompat"> <item name="android:textColor">#00FF00</item> </style> </resources>
Puoi applicare lo stile a una visualizzazione come segue:
<TextView style="@style/GreenText" ... />
Ogni attributo specificato nello stile viene applicato alla vista se questa lo accetta. La visualizzazione ignora gli attributi che non accetta.
Tuttavia, anziché applicare uno stile a singole visualizzazioni, in genere appli gli stili come tema per l'intera app, attività o raccolta di visualizzazioni, come descritto in un'altra sezione di questa guida.
Estendere e personalizzare uno stile
Quando crei i tuoi stili, espandi sempre uno stile esistente dal framework o dalla libreria di supporto per mantenere la compatibilità con gli stili dell'interfaccia utente della piattaforma. Per estendere uno stile, specifica lo stile da estendere con l'attributo parent
. Puoi quindi sostituire gli attributi stile ereditati e aggiungerne di nuovi.
Ad esempio, puoi ereditare l'aspetto del testo predefinito della piattaforma Android e modificarlo come segue:
<style name="GreenText" parent="@android:style/TextAppearance"> <item name="android:textColor">#00FF00</item> </style>
Tuttavia, eredita sempre gli stili di app di base dalla libreria di assistenza Android. Gli stili nella libreria di supporto garantiscono la compatibilità ottimizzando ogni stile per gli attributi dell'interfaccia utente disponibili in ogni versione. Gli stili della libreria di assistenza hanno spesso un nome simile a quello della piattaforma, ma con AppCompat
incluso.
Per ereditare gli stili da una libreria o dal tuo progetto, dichiara il nome dello stile principale
senza la parte @android:style/
mostrata nell'esempio precedente. Ad esempio,
l'esempio seguente eredita gli stili di aspetto del testo dalla libreria Support:
<style name="GreenText" parent="TextAppearance.AppCompat"> <item name="android:textColor">#00FF00</item> </style>
Puoi anche ereditare gli stili, tranne quelli della piattaforma, estendendo il nome di uno stile con una notazione a punti, anziché utilizzare l'attributo parent
. In altre parole, anteponi al nome dello stile il nome dello stile da ereditare, separato da un punto. In genere, lo fai solo quando estendi i tuoi stili, non quelli di altre librerie. Ad esempio,
il seguente stile eredita tutti gli stili dall'elemento GreenText
nell'esempio precedente
e quindi aumenta le dimensioni del testo:
<style name="GreenText.Large"> <item name="android:textSize">22dp</item> </style>
Puoi continuare a ereditare stili come questo tutte le volte che vuoi collegando altri nomi.
Per sapere quali attributi puoi dichiarare con un tag <item>
, consulta la tabella "Attributi XML" nei vari riferimenti alle classi. Tutte le visualizzazioni supportano gli attributi XML della classe View
di base e molte aggiungono i propri attributi speciali. Ad esempio, gli
attributi XML TextView
includono l'attributo
android:inputType
che puoi applicare a una visualizzazione di testo che riceve input, ad esempio un
EditText
widget.
Applicare uno stile come tema
Puoi creare un tema nello stesso modo in cui crei gli stili. La differenza sta nel modo in cui li applichi: instead of applying a style with the style
attribute on a view, you apply a theme with
the android:theme
attribute on either the <application>
tag or an
<activity>
tag in the AndroidManifest.xml
file.
Ad esempio, ecco come applicare il tema "scuro" di Material Design della libreria di supporto Android all'intera app:
<manifest ... > <application android:theme="@style/Theme.AppCompat" ... > </application> </manifest>
Ecco come applicare il tema "chiaro" a una sola attività:
<manifest ... > <application ... > <activity android:theme="@style/Theme.AppCompat.Light" ... > </activity> </application> </manifest>
Ogni visualizzazione nell'app o nell'attività applica gli stili supportati da quelli definiti nel tema specificato. Se una vista supporta solo alcuni degli attributi dichiarati nello stile, applica solo questi attributi e ignora quelli non supportati.
A partire da Android 5.0 (livello API 21) e dalla versione 22.1 della libreria di supporto Android, puoi anche specificare
l'attributo android:theme
per una visualizzazione nel file di layout. In questo modo viene modificato il tema per quella visualizzazione e per tutte le visualizzazioni secondarie, il che è utile per modificare le tavolozze dei colori del tema in una parte specifica dell'interfaccia.
Gli esempi precedenti mostrano come applicare un tema come Theme.AppCompat
fornito dalla libreria di assistenza Android. Tuttavia, in genere è consigliabile personalizzare il tema in base al brand della tua app. Il modo migliore per farlo è estendere questi stili dalla raccolta di supporto e override alcuni degli attributi, come descritto nella sezione seguente.
Gerarchia degli stili
Android offre diversi modi per impostare gli attributi nell'app. Ad esempio, puoi impostare gli attributi direttamente in un layout, applicare uno stile a una visualizzazione, applicare un tema a un layout e persino impostare gli attributi tramite programmazione.
Quando scegli come definire lo stile della tua app, tieni presente la gerarchia degli stili di Android. In generale, utilizza temi e stili il più possibile per garantire coerenza. Se specifichi gli stessi attributi in più punti, l'elenco seguente determina quali attributi vengono applicati in ultima analisi. L'elenco è ordinato dalla precedenza più alta a quella più bassa.
- Applicazione di stili a livello di carattere o paragrafo utilizzando intervalli di testo alle classi ricavate da
TextView
. - Applicazione degli attributi in modo programmatico.
- Applicazione di singoli attributi direttamente a una visualizzazione.
- Applicazione di uno stile a una vista.
- Stile predefinito.
- Applicazione di un tema a una raccolta di visualizzazioni, a un'attività o all'intera app.
- Applicazione di determinati stili specifici per la visualizzazione, ad esempio l'impostazione di un
TextAppearance
su unTextView
.
TextAppearance
Un limite degli stili è che puoi applicarne uno solo a un View
. In un
TextView
, tuttavia, puoi anche specificare un
attributo
TextAppearance
che funziona in modo simile a uno stile, come mostrato nell'esempio seguente:
<TextView ... android:textAppearance="@android:style/TextAppearance.Material.Headline" android:text="This text is styled via textAppearance!" />
TextAppearance
ti consente di definire uno stile specifico per il testo, lasciando lo stile di un
View
disponibile per altri utilizzi. Tieni presente, tuttavia, che se definisci attributi di testo
direttamente su View
o in uno stile, questi valori sostituiscono i valori
TextAppearance
.
TextAppearance
supporta un sottoinsieme di attributi di stile offerti da TextView
. Per l'elenco completo degli attributi, consulta
TextAppearance
.
Alcuni attributi TextView
comuni non inclusi sono
lineHeight[Multiplier|Extra]
,
lines
,
breakStrategy
e
hyphenationFrequency
.
TextAppearance
funziona a livello di carattere e non di paragrafo, pertanto
gli attributi che influiscono sull'intero layout non sono supportati.
Personalizzare il tema predefinito
Quando crei un progetto con Android Studio, per impostazione predefinita viene applicato un tema Material Design all'app, come definito nel file styles.xml
del progetto. Questo stile AppTheme
estende un tema della libreria di supporto e include sostituzioni per gli attributi di colore utilizzati dagli elementi chiave dell'interfaccia utente, come la barra delle app e il pulsante di azione mobile, se utilizzato. Pertanto, puoi personalizzare rapidamente il design a colori della tua app aggiornando i colori forniti.
Ad esempio, il file styles.xml
ha il seguente aspetto:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style>
I valori di stile sono in realtà riferimenti ad altre
risorse di colore, definite nel
file res/values/colors.xml
del progetto. È il file che modifichi per cambiare i colori.
Consulta la Panoramica dei colori di Material Design per migliorare l'esperienza utente con colori dinamici e altri colori personalizzati.
Una volta che conosci i colori, aggiorna i valori in res/values/colors.xml
:
<?xml version="1.0" encoding="utf-8"?> <resources> <!-- Color for the app bar and other primary UI elements. --> <color name="colorPrimary">#3F51B5</color> <!-- A darker variant of the primary color, used for the status bar (on Android 5.0+) and contextual app bars. --> <color name="colorPrimaryDark">#303F9F</color> <!-- a secondary color for controls like checkboxes and text fields. --> <color name="colorAccent">#FF4081</color> </resources>
Puoi quindi sostituire gli altri stili che preferisci. Ad esempio, puoi modificare il colore sfondo dell'attività come segue:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> ... <item name="android:windowBackground">@color/activityBackground</item> </style>
Per un elenco degli attributi che puoi utilizzare nel tema, consulta la tabella degli attributi all'indirizzo
R.styleable.Theme
. Quando aggiungi stili per le visualizzazioni nel layout, puoi trovare gli attributi anche consultando la tabella "Attributi XML" nei riferimenti alle classi di visualizzazione. Ad esempio, tutte le viste supportano gli attributi XML della classe View
di base.
La maggior parte degli attributi viene applicata a tipi specifici di visualizzazioni, mentre alcuni si applicano a tutte le visualizzazioni. Tuttavia, alcuni attributi del tema elencati in R.styleable.Theme
si applicano alla finestra delle attività, non alle viste nel layout. Ad esempio, windowBackground
cambia lo sfondo della finestra e windowEnterTransition
definisce un'animazione di transizione da utilizzare all'avvio dell'attività. Per maggiori dettagli, vedi Avvia
un'attività utilizzando un'animazione.
La raccolta Android Support Library fornisce anche altri attributi che puoi utilizzare per personalizzare il tema
estratto da Theme.AppCompat
, ad esempio l'attributo colorPrimary
mostrato nell'esempio precedente. Questi elementi sono visualizzati al meglio nel
file attrs.xml
della raccolta.
Nella libreria di supporto sono disponibili anche diversi temi che potresti estendere instead of quelli mostrati nell'esempio precedente. Il posto migliore per vedere i temi disponibili è il
file themes.xml
della raccolta.
Aggiungere stili specifici per la versione
Se una nuova versione di Android aggiunge attributi del tema che vuoi utilizzare, puoi aggiungerli al tuo tema rimanendo compatibile con le versioni precedenti. Ti serve solo un altro file styles.xml
memorizzato in una directory values
che includa il qualificatore della versione della risorsa:
res/values/styles.xml # themes for all versions res/values-v21/styles.xml # themes for API level 21+ only
Poiché gli stili nel file values/styles.xml
sono disponibili per tutte le versioni,
i tuoi temi in values-v21/styles.xml
possono ereditarli. Ciò significa che puoi evitare di duplicare gli stili iniziando con un tema "base" e poi estenderlo negli stili specifici della versione.
Ad esempio, per dichiarare le transizioni di finestra per Android 5.0 (livello API 21) e versioni successive, devi usare nuovi attributi. Pertanto, il tema di base in res/values/styles.xml
può avere il seguente aspetto:
<resources> <!-- Base set of styles that apply to all versions. --> <style name="BaseAppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="colorPrimary">@color/primaryColor</item> <item name="colorPrimaryDark">@color/primaryTextColor</item> <item name="colorAccent">@color/secondaryColor</item> </style> <!-- Declare the theme name that's actually applied in the manifest file. --> <style name="AppTheme" parent="BaseAppTheme" /> </resources>
Aggiungi poi gli stili specifici della versione in res/values-v21/styles.xml
, come segue:
<resources> <!-- extend the base theme to add styles available only with API level 21+ --> <style name="AppTheme" parent="BaseAppTheme"> <item name="android:windowActivityTransitions">true</item> <item name="android:windowEnterTransition">@android:transition/slide_right</item> <item name="android:windowExitTransition">@android:transition/slide_left</item> </style> </resources>
Ora puoi applicare AppTheme
nel file manifest e il sistema seleziona gli stili disponibili per ogni versione di sistema.
Per ulteriori informazioni sull'utilizzo di risorse alternative per dispositivi diversi, consulta Fornire risorse alternative.
Personalizzare gli stili dei widget
Ogni widget nel framework e nella libreria di supporto ha uno stile predefinito. Ad esempio, quando stili la tua app utilizzando un tema della raccolta Support Library, a un'istanza di Button
viene applicato lo stile Widget.AppCompat.Button
. Se vuoi applicare uno stile di widget diverso a un pulsante, puoi farlo con l'attributo style
nel file di layout. Ad esempio, il codice seguente applica lo stile del pulsante senza bordi della raccolta:
<Button style="@style/Widget.AppCompat.Button.Borderless" ... />
Se vuoi applicare questo stile a tutti i pulsanti, puoi dichiararlo nel buttonStyle
del tema come segue:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="buttonStyle">@style/Widget.AppCompat.Button.Borderless</item> ... </style>
Puoi anche estendere gli stili dei widget, come qualsiasi altro stile, e poi applicare lo stile del widget personalizzato nel layout o nel tema.
Risorse aggiuntive
Per scoprire di più su temi e stili, consulta le seguenti risorse aggiuntive:
Post del blog
- Stili Android: temi e stili
- Personalizzazione di Android: attributi dei temi comuni
- Stili Android: preferisci gli attributi del tema