Autore Topic: Cambio set colori  (Letto 547 volte)

Offline wlf

  • Utente normale
  • ***
  • Post: 319
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Cambio set colori
« il: 09 Febbraio 2015, 10:44:33 CET »
0
Salve ragazzi, cercavo qualche suggerimento di dove reperire informazioni su come gestire la possibilità di cambiare il set colori dai settings. Praticamente ho inserito uno spinner nei settings con combinazione colori 1, combinazione colori 2, combinazione colori 3. La mia intenzione sarebbe che selezionando una delle scelte dello spinner la mia app cambi il set colori.
Negli XML dei Layout ho definito a seconda che sia il LinearLayout o un bottone:

Codice (XML): [Seleziona]
android:background="@color/sfondo"
...
android:background="@color/bottone1"
...
android:background="@color/bottone2"
...
android:background="@color/bottone3"

I colori vengono presi da res/values/colors.XML.
Posso riassegnare i valori dei vari colori definiti in colors.XML o sono delle costanti? Suggerite altrimenti che in colors.XML inserisca le 3 combinazioni diverse e poi da ogni activity, da codice riassegno il background ad ogni widget in base alla selezione dei settings?

Grazie.

Offline wlf

  • Utente normale
  • ***
  • Post: 319
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:Cambio set colori
« Risposta #1 il: 11 Febbraio 2015, 10:12:35 CET »
0
Posso crearmi delle cartelle res/values-xx a mio piacimento e condizionare il caricamento di diversi colors.XML a qualche condizione particolare? Oltre ai classici values-it, values-de, values-v11, values-v14, etc posso crearmene anche dei miei personalizzati?
Grazie.

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 596
  • Respect: +133
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Cambio set colori
« Risposta #2 il: 11 Febbraio 2015, 10:44:16 CET »
+1
Non credo tu possa definire delle cartelle "custom" sotto res.

Quello che puoi fare di certo è utilizzare i temi, ma ti richiede un po' di refactoring del codice.

Fammi sapere se ti serve un esempio, nel caso te lo preparo.
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 wlf

  • Utente normale
  • ***
  • Post: 319
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:Cambio set colori
« Risposta #3 il: 11 Febbraio 2015, 12:21:28 CET »
0
Non credo tu possa definire delle cartelle "custom" sotto res.

Infatti sembrerebbe che le "custom folders" non siano supportate  sotto res. :(

Citazione
Quello che puoi fare di certo è utilizzare i temi, ma ti richiede un po' di refactorng del codice.

Ho già provato a dare una occhiata ai temi, ma questi non sembrano risolvere la mia problematica. :(
Se su ogni layout ho 6 bottoni di colore diverso definiti all'interno del layout stesso come backgroundBtn1, backgroundBtn2, backgroundBtn3, etc, con un tema avrei un unico background per tutti i bottoni, non 6 background diversi.
L'unica soluzione sembra essere di cambiare ogni widget da codice dentro ad ogni activity ... un lavoraccio. :(
Se si potesse cambiare il colors.XML si potrebbe cambiare l'intero set di colori in un sol botto ... ma questo funzionerebbe solo per i tipi di values consentiti ... :(

Citazione
Fammi sapere se ti serve un esempio, nel caso te lo preparo.

Troppo gentile, non vorrei farti perdere perdere tempo inutilmente però; ti è chiara la problematica, o mi sono spiegato male?
Grazie

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 596
  • Respect: +133
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Cambio set colori
« Risposta #4 il: 11 Febbraio 2015, 12:33:58 CET »
+1
Credo di aver capito il problema.

La soluzione è sicuramente percorribile tramite temi, ma come avevo accennato richiede che tu modifichi l'impostazione che hai dato al layout.

In particolare, invece di assegnare un colore ai button/spinner nel Layout, dovresti assegnare loro uno stile, e definire il colore di sfondo nello stile.

Tramite temi, poi, hai modo di ridefinire lo stile applicato ai button, quindi il loro sfondo.

Ti faccio un piccolo esempio appena posso

Post unito: 11 Febbraio 2015, 13:09:08 CET
L'esempio che segue crea due combinazioni per uno spinner ed un button. Aggiungere combinazioni o elementi dovrebbe essere triviale.

Definizione degli attributi del tema
Crea il file values/attrs.xml (o modifica quello che hai) con questi attributi:

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

        <declare-styleable name="YourThemeAttrs">
                <attr name="spinnerStyle" format="reference" />
                <attr name="button01Style" format="reference" />
        </declare-styleable>
</resources>

Definizione dei temi e degli stili
Crea o modifica styles.xml:
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">

        <style name="AppBaseTheme" parent="@android:style/Theme">
        </style>

        <!-- *********** -->
        <!-- First Theme -->
        <!-- *********** -->
        <!-- Application theme. -->
        <style name="FirstTheme" parent="AppBaseTheme">
                <item name="spinnerStyle">@style/FirstSpinnerStyle</item>
                <item name="button01Style">@style/FirstButton01Style</item>
        </style>
       
        <!-- Spinner -->
        <style name="FirstSpinnerStyle" parent="@android:style/Widget.Spinner">
                <item name="android:background">@color/sfondo</item>
        </style>

        <!-- Button -->
        <style name="FirstButton01Style" parent="@android:style/Widget.Button">
                <item name="android:background">@color/bottone1</item>
        </style>

        <!-- ************ -->
        <!-- Second Theme -->
        <!-- ************ -->
        <!-- Application theme. -->
        <style name="SecondTheme" parent="AppBaseTheme">
                <item name="spinnerStyle">@style/SecondSpinnerStyle</item>
                <item name="button01Style">@style/SecondButton01Style</item>
        </style>
       
        <!-- Spinner -->
        <style name="SecondSpinnerStyle" parent="@android:style/Widget.Spinner">
                <item name="android:background">@color/sfondo_2</item>
        </style>

        <!-- Button -->
        <style name="SecondButton01Style" parent="@android:style/Widget.Button">
                <item name="android:background">@color/bottone1_2</item>
        </style>
</resources>

Applicazione degli stili ai widget
Nei tuoi layout come stile usa il riferimento creato in attrs.xml:

Codice (XML): [Seleziona]
<Spinner style="?attr/spinnerStyle"
   ...
   
<Button style="?attr/button01Style"
   ...

Selezione del tema nelle activity
Nella onCreate, PRIMA di invocare la super.onCreate(), usa

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

                if (usaPrimoTema) {
                  setTheme(R.style.FirstTheme);
                } else {
                  setTheme(R.style.SecondTheme);
                }

                super.onCreate(savedInstanceState);

                ...
« Ultima modifica: 11 Febbraio 2015, 13:09:08 CET da Ohmnibus, Reason: Merged DoublePost »
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 wlf

  • Utente normale
  • ***
  • Post: 319
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:Cambio set colori
« Risposta #5 il: 12 Febbraio 2015, 15:31:31 CET »
0
Ho provato come hai indicato, non mi da errore in compilazione ma i colori dei bottoni non cambiano ...

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

    <declare-styleable name="YourThemeAttrs">
        <attr name="button01Style" format="reference" />
        <attr name="button02Style" format="reference" />
    </declare-styleable>

</resources>

In styles.xml ho aggiunto:
Codice (XML): [Seleziona]
    <!-- *********** -->
    <!-- First Theme -->
    <!-- *********** -->
    <!-- Application theme. -->
    <style name="FirstTheme" parent="AppBaseTheme">
        <item name="button01Style">@style/FirstButton01Style</item>
        <item name="button02Style">@style/FirstButton02Style</item>
        <item name="android:background">@color/bckNewsYel</item>
    </style>

    <!-- Button -->
    <style name="FirstButton01Style" parent="@android:style/Widget.Button">
        <item name="android:background">@color/bottone1Yel</item>
    </style>
    <style name="FirstButton02Style" parent="@android:style/Widget.Button">
        <item name="android:background">@color/bottone2Yel</item>
    </style>
   
    <!-- ************ -->
    <!-- Second Theme -->
    <!-- ************ -->
    <!-- Application theme. -->
    <style name="SecondTheme" parent="AppBaseTheme">
        <item name="button01Style">@style/SecondButton01Style</item>
        <item name="button02Style">@style/SecondButton02Style</item>
        <item name="android:background">@color/bckNewsGre</item>
    </style>

    <!-- Button -->
    <style name="SecondButton01Style" parent="@android:style/Widget.Button">
        <item name="android:background">@color/bottone1Gre</item>
    </style>
    <style name="SecondButton02Style" parent="@android:style/Widget.Button">
        <item name="android:background">@color/bottone2Gre</item>
    </style>

Nel layout dell'activity ho dichiarato i widget:
Codice (XML): [Seleziona]
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:paddingBottom="@dimen/activity_vertical_margin"
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   tools:context="com.example.colori.MainActivity" >

    <TextView
       android:id="@+id/textView1"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="@string/hello_world" />

    <Button
       android:id="@+id/button1"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_below="@+id/textView1"
       android:layout_centerHorizontal="true"
       android:layout_marginTop="30dp"
       android:text="Button"
       style="@attr/button01Style" />

    <Button
       android:id="@+id/button2"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_centerHorizontal="true"
       android:layout_below="@+id/button1"
       android:layout_marginTop="50dp"
       android:text="Button"
       style="@attr/button02Style" />

</RelativeLayout>

A logica dovrebbe funzionare, ma nella pratica non funziona; probabilmente mi sfugge qualcosa che non riesco ad individuare ... :(

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 596
  • Respect: +133
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Cambio set colori
« Risposta #6 il: 12 Febbraio 2015, 15:39:12 CET »
0
Effettivamente sembra tutto corretto.

Prova a verificare cambiando lo stile applicato nell'anteprima di Android Studio / ADT: se funziona probabilmente hai sbagliato qualcosa nell'applicare lo stile nella onCreate(), altrimenti c'è un problema nella definizione dello stile che ora mi sfugge...

Post unito: 12 Febbraio 2015, 16:09:25 CET
Ho trovato.

Quando fai riferimento ad uno stile definito in un tema devi usare il "?" e non la "@":

Codice (XML): [Seleziona]
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:paddingBottom="@dimen/activity_vertical_margin"
  android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
  android:paddingTop="@dimen/activity_vertical_margin"
  tools:context="com.example.colori.MainActivity" >

    <TextView
      android:id="@+id/textView1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="@string/hello_world" />

    <Button
      android:id="@+id/button1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_below="@+id/textView1"
      android:layout_centerHorizontal="true"
      android:layout_marginTop="30dp"
      android:text="Button"
      style="?attr/button01Style" />

    <Button
      android:id="@+id/button2"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_centerHorizontal="true"
      android:layout_below="@+id/button1"
      android:layout_marginTop="50dp"
      android:text="Button"
      style="?attr/button02Style" />

</RelativeLayout>

Nota inoltre che il background di un button è uno StateDrawable composto da immagini 9-patch. Se imposti un colore non avrà più l'aspetto di un button.
« Ultima modifica: 12 Febbraio 2015, 16:09:25 CET da Ohmnibus, Reason: Merged DoublePost »
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.