Autore Topic: [Temi] Cambiare colore pulsanti/testo/etc... in base al tema: come si fa?  (Letto 705 volte)

Offline Noisemaker

  • Utente junior
  • **
  • Post: 58
  • Respect: +1
    • Mostra profilo
Ciao a tutti :)
Sviluppo su android da diverso tempo, ho fatto anche la tesi magistrale su alcuni aspetti della sicurezza di questo OS, etc... ma ammetto che non ho mai affrontato seriamente la parte UI relativa ai temi :( (ho sempre fatto app con un solo tema, chiaro o scuro che fosse, se senza possibilità di cambiarlo a piacere)

Nell'app che ho fatto avrei bisogno di cambiare, in base al tema, il colore di diversi componenti grafici (bottoni, colore del testo di alcune parti, etc...) ma non capisco bene come fare. Io ho definito degli stili per le varie componenti, però come faccio a dirgli quando c'è questo tema usa questo?
Devo creare stili duplicati con un nome diverso?

Ringrazio chiunque sappia darmi due dritte su questo aspetto :)

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 711
  • Respect: +150
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:[Temi] Cambiare colore pulsanti/testo/etc... in base al tema: come si fa?
« Risposta #1 il: 29 Dicembre 2014, 14:56:20 CET »
0
Ho affrontato recentemente il problema, ed ho notato che mentre le nozioni di base sono piuttosto ben documentate, alcuni meccanismi non lo sono. Quello che segue è un breve sunto di quello che ho capito.

Gli stili ed i temi sono sostanzialmente la stessa cosa, da un punto di vista di definizione.

L'unica differenza concreta è che uno stile si applica solitamente ad un widget, un tema si applica all'app o ad un'activity.

Stili e temi sono comunemente definiti nel file styles.xml nella cartella res/values, ma direi che possono essere inseriti in qualsiasi altro file di risorse.

I temi sono una collezione di stili, e solitamente vengono definiti a partire da altri temi.

In una mia app ho definito un tema di base come segue:

Codice (XML): [Seleziona]
<style name="AppBaseTheme" parent="@android:style/Theme">
</style>

Questa pratica è piuttosto comoda in quanto permette di modificare la base in funzione della versione. Nel mio caso ho infatti ridefinito il tema di base per la versione 11 delle api creando un altro styles.xml in res/values-v11:

Codice (XML): [Seleziona]
<style name="AppBaseTheme" parent="@android:style/Theme.Holo">
</style>

Definito il tema di base puoi procedere con la definizione dei tuoi temi personalizzati:

Codice (XML): [Seleziona]
<style name="My.Theme.Classic" parent="AppBaseTheme">
</style>

<style name="My.Theme.Elegant" parent="AppBaseTheme">
</style>

Supponiamo che nel primo tema vuoi i Button con lo sfondo rosso e nel secondo con lo sfondo bianco:

Codice (XML): [Seleziona]
<style name="My.Theme.Classic" parent="AppBaseTheme">
  <item name="android:buttonStyle">@style/Button.Classic</item>
</style>

<style name="My.Theme.Elegant" parent="AppBaseTheme">
  <item name="android:buttonStyle">@style/Button.Elegant</item>
</style>

<style name="Button.Classic" parent="@android:style/Widget.Button">
  <item name="android:background">#ff0000</item><!-- sfondo rosso -->
</style>

<style name="Button.Elegant" parent="@android:style/Widget.Button">
  <item name="android:background">#ffffff</item><!-- sfondo bianco -->
</style>

Gli attributi dei temi sono definiti qui: R.attr

Puoi definire attributi personalizzati creandoli in values/attrs.xml:

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<resources>

        <declare-styleable name="MyStileAttr"><!-- Il nome mi pare ininfluente -->
                <attr name="MySpecialWidget" format="reference" />
        </declare-styleable>
</resources>

ed usarli così:

Codice (XML): [Seleziona]
<style name="My.Theme.Classic" parent="AppBaseTheme">
  <item name="android:buttonStyle">@style/Button.Classic</item>
  <item name="MySpecialWidget">@style/Button.Classic</item>
</style>

<style name="My.Theme.Elegant" parent="AppBaseTheme">
  <item name="android:buttonStyle">@style/Button.Elegant</item>
  <item name="MySpecialWidget">@style/Button.Elegant</item>
</style>

<style name="Button.Classic" parent="@android:style/Widget.Button">
  <item name="android:background">#ff0000</item><!-- sfondo rosso -->
</style>

<style name="Button.Elegant" parent="@android:style/Widget.Button">
  <item name="android:background">#ffffff</item><!-- sfondo bianco -->
</style>

quindi possono essere utilizzati nei layout:

Codice (XML): [Seleziona]
<!-- La seguente imageview avrà l'aspetto di un Button e lo sfondo rosso o bianco in base al tema -->
<ImageView style="?attr/MySpecialWidget"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 />

Nel manifest puoi definire il tema predefinito per ogni activity:

Codice (XML): [Seleziona]
<activity
 android:theme="@style/My.Theme.Classic"
 android:name=".activity.MyActivity" />

oppure puoi specificarlo via codice nella onCreate:

Codice (Java): [Seleziona]
@Override
public void onCreate(Bundle savedInstanceState) {

  setTheme(R.style.My_Theme_Classic); // "_" al posto dei punti

  super.onCreate(savedInstanceState);

  ...
}
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Noisemaker

  • Utente junior
  • **
  • Post: 58
  • Respect: +1
    • Mostra profilo
Re:[Temi] Cambiare colore pulsanti/testo/etc... in base al tema: come si fa?
« Risposta #2 il: 29 Dicembre 2014, 15:17:55 CET »
0
Ti ringrazio molto per la spiegazione molto esaustiva. Ora me la leggo con calma :)
Ad una prima occhiata però mi pare di avere conferma di quello che già pensavo da tempo, ovvero che lato UI la programmazione Android ha diverse cose un po troppo complesse/intricate.