Autore Topic: Colore tabella di bottoni  (Letto 1480 volte)

Offline Qwertid

  • Utente junior
  • **
  • Post: 50
  • Respect: 0
    • Mostra profilo
Colore tabella di bottoni
« il: 10 Settembre 2011, 10:46:34 CEST »
0
Ciao a tutti!
Ho creato una tabella di bottoni e, separatamente, un file png con l'aspetto che tutti i bottoni devono avere (niente di particolare, c'è solamente un bordino punteggiato).

A questo punto ho necessità di colorare righe o colonne intere di bottoni appunto: genero un colore e lo applico al pulsante con setBackgroundColor. Ottengo l'effetto desiderato ma c'è soltanto un problema: tra un pulsante e l'altro perdo la trama del bordino del bottone.

Una figura dice più di mille parole


Avete idea di come possa fare a risolvere?  :-(

Grazie!

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Colore tabella di bottoni
« Risposta #1 il: 10 Settembre 2011, 11:41:26 CEST »
0
Avete idea di come possa fare a risolvere?  :-(

Evita soluzioni personali complesse. Utilizza i draw 9-patch:

2D Graphics | Android Developers
Draw 9-patch | Android Developers
adb logcat | tee /tmp/logcat | grep TAG

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Colore tabella di bottoni
« Risposta #2 il: 10 Settembre 2011, 16:46:25 CEST »
+1
Secondo me è impossibile da ottenere utilizzando dei button perché non hanno un livello "background" e un livello "immagine", quindi se cambi il background, cambi tutto. Sarebbe preferibile usare delle imageview (visto che comunque anche un imagebutton sarebbe superfluo in questo caso).
Nelle imageview usi come attributo src il png (con sfondo trasparente e con solo il trattino), e lo sfondo poi lo setti programmaticamente come preferisci.

Per comodità definirei un selector per il background che contenga gli stati di selected:true e selected:false, e magari anche uno style che  rimandi l'attributo src al png e l'attributo background al selector.

Offline Qwertid

  • Utente junior
  • **
  • Post: 50
  • Respect: 0
    • Mostra profilo
Re:Colore tabella di bottoni
« Risposta #3 il: 10 Settembre 2011, 19:13:28 CEST »
0
Grazie del suggerimento: in effetti con le ImageView posso giostrare su due fronti invece che su uno soltanto..

Mi sono creato un file con il contorno di trattini senza sfondo al centro. L'ho applicato all'ImageView con il tag src ed in seguito ho impostato un colore di sfondo con l'attributo background.

Ho però un problema: visto che le mie ImageView hanno una dimensione fissa (che specifico in 32dp) per riuscire a formare una tabella, quando applico l'src esso non occupa tutta la casellina ma soltanto metà all'incirca. Il file per il contorno è un quadrato di dimensione 100pixel x 100 pixel invece

Da cosa potrebbe dipendere?
« Ultima modifica: 10 Settembre 2011, 19:15:15 CEST da Qwertid »

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Colore tabella di bottoni
« Risposta #4 il: 10 Settembre 2011, 19:18:35 CEST »
+1
Grazie del suggerimento: in effetti con le ImageView posso giostrare su due fronti invece che su uno soltanto..

Mi sono creato un file con il contorno di trattini senza sfondo al centro. L'ho applicato all'ImageView con il tag src ed in seguito ho impostato un colore di sfondo con l'attributo background.

Ho però un problema: visto che le mie ImageView hanno una dimensione fissa (che specifico in 32dp) per riuscire a formare una tabella, quando applico l'src esso non occupa tutta la casellina ma soltanto metà all'incirca. Il file per il contorno è un quadrato di dimensione 100pixel x 100 pixel invece

Da cosa potrebbe dipendere?

Dall'attributo scaleType. Prova con centerInside se il png ha le stesse proporzioni del "pulsante", sennò fitXY, che però immagino distorca il tratteggio.  ;-)

Offline Qwertid

  • Utente junior
  • **
  • Post: 50
  • Respect: 0
    • Mostra profilo
Re:Colore tabella di bottoni
« Risposta #5 il: 10 Settembre 2011, 19:45:59 CEST »
0
Wow grazie!!!!  :-)

Spero di riuscire a definire uno stile per applicare queste modifiche: spero di non romperti ancora!!  :-P

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Colore tabella di bottoni
« Risposta #6 il: 10 Settembre 2011, 19:58:46 CEST »
0
Ahah! Ma di niente, figurati.  :-)

Offline Qwertid

  • Utente junior
  • **
  • Post: 50
  • Respect: 0
    • Mostra profilo
Re:Colore tabella di bottoni
« Risposta #7 il: 10 Settembre 2011, 23:16:36 CEST »
0
Non è passato molto e già torno a rompere  :D

Ho creato senza problemi lo stile e adesso l'effetto (e la pulizia del codice xml) è davvero buono  :-)

Ho necessità, però, in via programmatica di sapere il colore di sfondo associato all'imageview specificato da un id: ho controllato un pò i metodi ma non mi sembra ci sia niente che possa fare al caso mio...

Suggerimenti? :D (Pinta di birra in arrivo....)

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Colore tabella di bottoni
« Risposta #8 il: 10 Settembre 2011, 23:31:29 CEST »
0
Il primo modo che mi viene in mente, visto che sono pulsanti in una tabella, è, nel momento in cui cambi il background, associare il codice del colore di background al pulsante tramite il metodo setTag(). Quando vuoi conoscere il colore del background, usi il metodo getTag(), facendo un cast in base a dove/come hai definito il colore. Per esempio, se hai definito i colori nel colors.xml, fai pulsante.setTag(R.color.blue) e poi (int) pulsante.getTag(). Se è nullo è quello di default, ecc...
Probabilmente c'è qualche altro modo, ma è il primo e unico che mi viene in mente.  :-)

Offline Qwertid

  • Utente junior
  • **
  • Post: 50
  • Respect: 0
    • Mostra profilo
Re:Colore tabella di bottoni
« Risposta #9 il: 11 Settembre 2011, 11:30:49 CEST »
0
Ciao e buona domenica  :-)

Vorrei seguire il tuo approccio che mi risolverebbe anche un altro problema... Nel mio file dello stile ho scritto una cosa del genere:

Codice (Java): [Seleziona]
        <item name="android:background">@color/verde</item>
        <item name="android:id">@color/verde</item>

Quindi ogni ImageView (ho fatto il passaggio ad ImageView da Button) è colorata di verde.. Poichè l'informazione sul colore della casella è importante per me, avevo pensato di salvare lo stesso ID del colore nell'attributo tag così da poterlo referenziare in futuro. Ma credo di sbagliare qualcosa...

Codice (Java): [Seleziona]
ImageView prova = (ImageView) findViewById(R.id.R00C00);
int codColore = prova.getId();

TextView infoGrid = (TextView) findViewById(R.id.infoGrid);
infoGrid.setText("Ciao mamma");                
infoGrid.setTextColor(codColore);

Il testo della TextView non si colora di verde: probabilmente non referenzio l'ID giusto..



Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Colore tabella di bottoni
« Risposta #10 il: 11 Settembre 2011, 11:41:21 CEST »
0
Con prova.getId() prendi l'id dell'imageview, che in questo caso è R.id.R00C00 (Perché immagino che nell'xml principale setti un altro id).
Dovresti cambiare in:
Codice (XML): [Seleziona]
 
        <item name="android:background">@color/verde</item>
        <item name="android:tag">@color/verde</item>

E poi:
Codice (Java): [Seleziona]
ImageView prova = (ImageView) findViewById(R.id.R00C00);
int codColore = (int) prova.getTag();

TextView infoGrid = (TextView) findViewById(R.id.infoGrid);
infoGrid.setText("Ciao mamma");                
infoGrid.setTextColor(codColore);

[/quote]

Offline Qwertid

  • Utente junior
  • **
  • Post: 50
  • Respect: 0
    • Mostra profilo
Re:Colore tabella di bottoni
« Risposta #11 il: 11 Settembre 2011, 12:04:48 CEST »
0
Purtroppo non funziona.. Mi da un errore di NullPointer al momento di colorare la textview (che esiste, perchè se forzo il colore manualmente funziona)  :-(

Codice (Java): [Seleziona]
Integer codColore = (Integer) prova.getTag();
                       
infoGrid.setTextColor(codColore);

Ho usato il tipo wrapper Integer visto che getTag restituisce un Object.


EDIT: Mi correggo.. Il problema di NullPointer si ha sul getTag

« Ultima modifica: 11 Settembre 2011, 12:08:10 CEST da Qwertid »

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Colore tabella di bottoni
« Risposta #12 il: 11 Settembre 2011, 12:10:46 CEST »
0
Ahn...credo sia perché quando si setta un tag dall'xml viene inserito come stringa. Prova con un Integer.valueOf(prova.getTag()), ma non credo funzioni.  :-) Ma i colori li imposti tutti tramite il file di layout, oppure tutte le caselle hanno un colore di default che cambi nel codice?

Offline Qwertid

  • Utente junior
  • **
  • Post: 50
  • Respect: 0
    • Mostra profilo
Re:Colore tabella di bottoni
« Risposta #13 il: 11 Settembre 2011, 12:15:04 CEST »
0
Ogni casella ha un colore di default all'inizio (impostato nel file di stile) che cambio man mano nel codice. Vorrei che il tag Id rispecchiasse, quindi, la colorazione attuale della casella.

Con la soluzione del valueOf mi dice "unable to parse null as integer": a questo punto credo che il problema stia nell'inizializzazione del tag id all'interno del file xml.

Codice (Java): [Seleziona]
String cod = (String) prova.getTag();
infoGrid.setTextColor(Integer.valueOf(cod));

Che ne pensi?


P.S: Poi mi comunicherai l'IBAN a cui far partire il bonifico  :-)

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Colore tabella di bottoni
« Risposta #14 il: 11 Settembre 2011, 12:17:55 CEST »
+1
Ottimo, allora, come avevo scritto all'inizio, fai un nullcheck: se è nullo, sai che il colore è quello di default, sennò lo usi.
Ovviamente, solo nel codice, quando cambi il colore della tabella (imageview.setColor(R.color.blue), immagino), devi aggiungere anche imageview.setTag(R.color.blue).   ;-)