domenica 16 novembre 2008

GridLayout per BlackBerry

Dopo aver completato lo sviluppo di IBANc, l'applicazione per la gestione di codici IBAN per BlackBerry, ho iniziato a cercare nuove esigenze per cui varrebbe la pena realizzare un software da far girare sui telefonini di RIM. Durante questo studio, mi sono reso conto che un aspetto, su cui la libreria Java del BlackBerry è carente, è la gestione del posizionamento dei componenti grafici sullo schermo. I contenitori standard (VerticalFieldManager e HorizontalFieldManager), anche se combinati fra loro, non permettono di collocare i componenti con la precisione necessaria per la realizzazione di una maschera complessa e inoltre non consentono di incolonnare i vari campi. Quest'ultima caratteristica negativa porta a risultati che, per mio gusto personale, non sono particolarmente piacevoli da vedere, come mostra abbastanza chiaramente la figura seguente:Si può notare come i vari campi di immissione siano disallineati rispetto ad un ideale asse verticale. Infine è molto complesso, se non impossibile, affiancare orizzontalmente due o più campi.
Sono quindi arrivato alla conclusione che è necessario disporre di un nuovo contenitore, sottoclasse di net.rim.device.api.ui.Manager, che fornisca funzionalità analoghe, anche se più semplici, del GridBagLayout dell'AWT di Java.
Ho deciso di chiamarlo it.datafox.bb.ui.container.GridLayoutManager, in quanto permette di disporre i componenti visuali su una griglia (GridLayout), con un numero prefissato di righe e colonne, ciascuna delle quali ha una larghezza definita dall'utilizzatore, espressa come percentuale della larghezza totale dello schermo. Per garantire una maggiore flessibilità, ho reso possibile estendere ogni campo su un numero arbitrario di righe e colonne, utilizzando un meccanismo analogo a quello del colspan/rowspan dell'HTML. La schermata seguente mostra lo stesso gruppo di componenti disposti grazie al GridLayout, utilizzando una griglia con due colonne e diverse righe.Tutti i campi di immissione, che si trovano nella seconda colonna, sono allineati verticalmente e alcuni campi speciali, come il gauge (la barra con la percentuale) o la lista, hanno un colspan pari a due e quindi occupano tutto lo spazio orizzontale disponibile. Si può anche notare che i due radio button sono posizionati sulla stessa riga, come sembra logico aspettarsi, visto che sono mutuamente esclusivi. Ho preparato anche un'altra schermata, in cui le colonne sono tre e dove ho posizionato i vari componenti con allineamenti orizzontali diversi.Per poter sfruttare le funzionalità del GridLayoutManager nel modo più semplice, ho creato anche una sottoclasse astratta di net.rim.device.api.ui.container.FullScreen, che si chiama it.datafox.bb.ui.container.FormScreen, da utilizzare per implementare i propri schermi di tipo form (maschere di visualizzazione o gestione di dati complessi). I metodi salienti del FormScreen sono il costruttore e l'add. Il costruttore ha la seguente firma:
public FormScreen(int numRows, int numCols, float[] colWidthPercs, long style)
e i parametri forniscono le seguenti informazioni:
  • numRows - numero di righe della griglia
  • numCols - numero di colonne della griglia
  • colWidthPercs - larghezza percentuale di ciascuna colonna
Il metodo add permette di aggiungere un campo allo schermo e ha le seguente firma:
protected void add(Field field, int x, int y, int rowspan, int colspan)
I parametri forniscono le seguenti informazioni:
  • field - campo che si vuole aggiungere allo schermo
  • x - colonna della griglia in cui si vuole inserire il campo
  • y - riga della griglia in cui si vuole inserire il campo
  • rowspan - numero di righe occupate dal campo
  • colpan - numero di colonne occupate dal campo
Quindi per creare un nuovo schermo con quattro righe e tre colonne e una dimensione relativa di 30, 40, 30 si può usare il seguente codice:
new TestScreen2(4, 3, new float[] { 30, 40, 30 },...)
e per aggiungere un'etichetta nella terza riga, in modo che la occupi tutta (colspan = 3) e che sia allineata al centro, si può scrivere in questo modo:
add(new LabelField("Label3", Field.FIELD_HCENTER), 0, 2, 1, 3)
Il codice sorgente del GridLayoutManager, del FormScreen e degli schermi di esempio riportati nelle schermate precedenti è scaricabile dal sito Web di DataFox. Ho testato questi componenti con tutti i simulatori dei dispositivi più recenti (dall'8100 al 9500) e il risultato è sempre stato positivo.

Restando in tema di sviluppo software per BlackBerry, vi segnalo un'interessante novità, cioè la nuova versione beta del plugin per Eclipse fornito da RIM. Questo rilascio è compatibile con Eclipse 3.4 e mette a disposizione tutti gli strumenti presenti nel JDE, come la firma del codice e la possibilità di scegliere la versione della libreria e del simulatore da utilizzare, integrandoli nel ben più potente ambiente di sviluppo Open Source. Da quando l'ho installato non ho riscontrato problemi e il suo utilizzo è veramente piacevole e produttivo, quindi lo consiglio a tutti quelli che realizzano software per BlackBerry.

Nessun commento:

Ricerca personalizzata