Capire i layout è importante per una buona progettazione delle applicazioni Android. In questo tutorial, si impara tutto sui layout relativi, che organizzano i controlli dell'interfaccia utente o dei widget, sullo schermo in relazione l'uno con l'altro o sul layout principale. Se utilizzati correttamente, i layout relativi possono essere il layout potente e flessibile su cui possono essere progettate molte interfacce utente di applicazioni Android interessanti.
Dopo i layout lineari, che visualizzano i controlli in una singola riga o colonna, i layout relativi sono uno dei tipi più comuni di layout utilizzati dai progettisti dell'interfaccia utente Android. Proprio come gli altri layout, i layout relativi possono essere definiti all'interno delle risorse del layout XML o in modo programmatico nel codice Java dell'applicazione. Il layout relativo funziona esattamente come suggerisce il nome: organizza controlli l'uno rispetto all'altro o al controllo genitore stesso.
Cosa significa questo? Significa che i controlli figlio, come i controlli ImageView, TextView e Button, possono essere posizionati sopra, sotto, a sinistra oa destra, l'uno dell'altro. I controlli figlio possono anche essere posizionati in relazione al genitore (il relativo contenitore di layout), incluso il posizionamento dei controlli allineati ai bordi superiore, inferiore, sinistro o destro del layout.
Il posizionamento relativo del controllo secondario del layout viene definito utilizzando le regole. Queste regole definiscono come vengono visualizzati i controlli all'interno del relativo layout. Per l'elenco completo delle regole relative ai layout relativi, consultare la documentazione dell'SDK di Android per la classe RelativeLayout. Gli attributi XML associati per l'utilizzo nelle risorse XML sono anche definiti nella documentazione.
NOTA: le regole richiedono che ogni controllo figlio abbia il proprio attributo id impostato correttamente.
I layout relativi sono spiegati meglio utilizzando un esempio. Diciamo che vogliamo progettare uno schermo con un controllo EditText e un controllo Button. Vogliamo che il pulsante venga visualizzato a destra del controllo EditText. Pertanto, potremmo definire un layout relativo con due controlli figlio: EditText e Button. Il controllo EditText potrebbe avere una regola che dice: allinea questo controllo nella parte sinistra del controllo genitore (il layout) e alla sinistra di un secondo controllo, un controllo Button. Nel frattempo, il controllo Button potrebbe avere una regola che dice: allinea questo controllo al lato destro del controllo genitore (il layout).
Le seguenti figure mostrano solo un layout relativo, visualizzato in modalità verticale o orizzontale. Il layout relativo ha due controlli figlio: un controllo EditText e un controllo Button.
Il modo più comodo e manutenibile per progettare interfacce utente dell'applicazione è creare risorse di layout XML. Questo metodo semplifica enormemente il processo di progettazione dell'interfaccia utente, spostando gran parte della creazione statica e del layout dei controlli dell'interfaccia utente e della definizione degli attributi di controllo in XML, invece di sporcare il codice.
Le risorse di layout XML devono essere memorizzate nella gerarchia di directory di progetto / res / layout. Diamo un'occhiata al layout relativo introdotto nella sezione precedente. Questo file di risorse di layout, giustamente denominato /res/layout/relative.xml, è definito in XML come segue:
Ricorda che, dall'interno dell'attività, è necessaria solo una singola riga di codice all'interno del metodo onCreate () per caricare e visualizzare una risorsa di layout sullo schermo. Se la risorsa di layout è stata memorizzata nel file /res/layout/relative.xml, quella riga di codice sarebbe:
setContentView (R.layout.relative);
Questo layout relativo ha la larghezza e l'altezza impostate per riempire lo schermo e tre regole configurate sui relativi controlli figlio:
È inoltre possibile creare e configurare i layout relativi a livello di codice. Questo viene fatto usando la classe RelativeLayout (android.widget.Relative). Troverai i parametri specifici del bambino nella classe RelativeLayout.LayoutParams. Inoltre, i parametri di layout tipici (android.view.ViewGroup.LayoutParams), come layout_height e layout_width, nonché i parametri di margine (ViewGroup.MarginLayoutParams), si applicano anche agli oggetti RelativeLayout.
Invece di caricare una risorsa di layout direttamente usando il metodo setContentView () come mostrato in precedenza, è necessario invece creare il contenuto dello schermo in Java e quindi fornire un oggetto di layout principale che contenga tutti i contenuti del controllo da visualizzare come viste figlio per setContentView () metodo. In questo caso, il layout principale sarà il layout relativo.
Ad esempio, il codice seguente illustra come programmare in modo programmatico un'attività per creare un'istanza di RelativeLayout e posizionare un controllo TextView e un pulsante all'interno di esso nel suo metodo onCreate (), molto simile a quello mostrato nella sezione precedente:
public void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); // setContentView (R.layout.relative); EditText ed = new EditText (questo); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams (LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); params.addRule (RelativeLayout.ALIGN_PARENT_LEFT); // usa lo stesso id come definito quando si aggiunge il pulsante params.addRule (RelativeLayout.LEFT_OF, 1001); ed.setLayoutParams (params); ed.setHint ("Enter some text ..."); Pulsante but1 = new Button (this); RelativeLayout.LayoutParams params2 = new RelativeLayout.LayoutParams (LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params2.addRule (RelativeLayout.ALIGN_PARENT_RIGHT); but1.setLayoutParams (params2); but1.setText ("Premi qui!"); // dare al pulsante un id che conosciamo but1.setId (1001); RelativeLayout layout1 = new RelativeLayout (this); layout1.setLayoutParams (new LayoutParams (LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); layout1.addView (ed); layout1.addView (but1); setContentView (Layout1);
Diamo un'occhiata più da vicino alla lista dei codici Java sopra. Per prima cosa creiamo un controllo EditText come di consueto. Gli diamo alcuni parametri RelativeLayout e quindi le sue regole. In questo caso, creiamo due regole per il controllo EditText.
Successivamente, creiamo un controllo Button e ne impostiamo la regola (allineato al bordo destro del layout principale). Infine, creiamo un oggetto RelativeLayout, impostiamo i suoi parametri, aggiungiamo i due controlli figlio usando il metodo addView () e cariciamo il layout relativo da visualizzare usando il metodo setContentView ().
Come puoi vedere, il codice può aumentare rapidamente di dimensioni man mano che vengono aggiunti più controlli sullo schermo. Per organizzazione e manutenibilità, la definizione e l'utilizzo di layout a livello di programmazione è preferibile per il caso dispari piuttosto che per la norma.
Parliamo un po 'degli attributi che aiutano a configurare un layout relativo e i suoi controlli figli. Alcuni attributi specifici si applicano ai layout relativi, ovvero le regole figlio, tra cui:
Inoltre, gli attributi generali in stile ViewGroup si applicano ai layout relativi. Questi includono:
Ora mettiamo alcune di queste regole in azione!
Diamo un'occhiata a uno schermo più complesso. Ai fini di questo esercizio, inizieremo guardando la progettazione finale dello schermo, e quindi lavoreremo all'indietro, discutendo le relative caratteristiche di layout e le regole utilizzate per ottenere questo risultato finale.
Diciamo che vogliamo progettare uno schermo simile a questo:
Per progettare questa schermata utilizzando un layout relativo, continua con i seguenti passaggi.
Innanzitutto, definisci un layout relativo nel tuo file di risorse XML. Poiché desideri che questo layout controlli il contenuto dell'intero schermo, imposta gli attributi di altezza e larghezza su fill_parent. Il tuo file di risorse XML dovrebbe ora assomigliare a questo:
Successivamente, determiniamo i controlli figlio di cui abbiamo bisogno. In questo caso, abbiamo bisogno di sette controlli TextView (uno per ogni colore). Configuralo come faresti normalmente, impostando gli attributi del testo su stringhe, colori di sfondo, dimensioni dei caratteri, ecc. Posiziona ognuno di questi controlli all'interno del tuo layout relativo.
Successivamente, definiamo le regole per ogni controllo figlio, al fine di indurlo a disegnare nelle posizioni appropriate:
Se definisci queste regole nel tuo file di risorse XML, ora dovrebbe assomigliare a questo:
Ecco alcuni suggerimenti per lavorare con i relativi layout.
IllegalStateException: le dipendenze circolari non possono esistere in un RelativeLayout
Può essere utile ricordare che le relative regole di layout sono applicate in un unico passaggio.
Le interfacce utente delle applicazioni Android sono definite utilizzando i layout e i relativi layout sono uno dei tipi di layout utilizzati per creare schermate applicative flessibili e potenti. Il layout relativo consente di organizzare i controlli figlio in relazione l'uno con l'altro e rispetto al genitore (i bordi e centrato verticalmente e orizzontalmente). Una volta padroneggiate le regole di come i layout relativi, possono essere incredibilmente versatili, consentendo di creare layout complessi senza il sovraccarico di annidare layout diversi, migliorando così le prestazioni.