Pubblicato da Takeshi Hagikura, Developer Programs Engineer 
 In occasione di Google I/O lo scorso anno, abbiamo presentato 
ConstraintLayout, che consente di creare layout complessi pur mantenendo la gerarchia a visualizzazione non strutturata. Questo prodotto è completamente supportato in 
Visual Layout Editor di Android Studio.  
 Al tempo stesso, abbiamo reso 
FlexboxLayout open source per offrire le stesse funzionalità del 
Modulo CSS Flexible Layout in Android. Ecco qui alcuni esempi per dimostrare la grande efficacia di 
FlexboxLayout.  
FlexboxLayout può essere considerato come un LinearLayout avanzato, dal momento che entrambi i layout allineano le visualizzazioni figlie in modo sequenziale. La differenza principale tra LinearLayout e 
FlexboxLayout è che 
FlexboxLayout presenta la funzione di disposizione delle immagini.  
 Ciò significa che se si aggiunge l'attributo 
flexWrap="wrap", 
FlexboxLayout colloca una visualizzazione nella riga successiva nel caso lo spazio nella riga corrente non sia sufficiente, come illustrato nella figura. 
Un unico layout per dimensioni schermo diverse
Tenendo questa caratteristica a mente, vediamo cosa succede quando disponiamo le visualizzazioni in sequenza ma dobbiamo spostarle nella riga seguente, se lo spazio disponibile varia (a causa di fattori relativi al dispositivo, ai cambiamenti di orientamento o al ridimensionamento della finestra in modalità multi-finestra).   
 
Pixel C con modalità multi-finestra abilitata e linea di divisione a sinistra
 
Pixel C con modalità multi-finestra abilitata e linea di divisione al centro
 
 
Pixel C con modalità multi-finestra abilitata e linea di divisione a destra
 
 
Sarà necessario definire più layout bucket DP (quali i layout-600dp, layout-720dp, layout-1020dp) per gestire le varie dimensioni dello schermo con layout tradizionali come 
LinearLayout o 
RelativeLayout. Tuttavia, la finestra di dialogo qui sopra è stata creata con un singolo 
FlexboxLayout.  
 Nella tecnica utilizzata per l'esempio, 
flexWrap="wrap" è stato impostato come indicato prima,  
<com .google.android.flexbox.flexboxlayout android:layout_width="match_parent" android:layout_height="wrap_content" app:flexwrap="wrap">
quindi potrai ottenere il seguente layout, nel quale le visualizzazioni figlie sono allineate in una nuova riga, invece di creare l'overflow della visualizzazione padre.   
 
 Un'altra tecnica interessante è l'impostazione dell'attributo 
layout_flexGrow a figlio individuale. Ciò consente di migliorare l'aspetto del layout finale quando rimane dello spazio libero. L'attributo 
layout_flexGrow si comporta in modo simile a quello 
layout_weight in 
LinearLayout. Questo significa che 
FlexboxLayout distribuirà lo spazio rimanente in base al valore 
layout_flexGrow impostato per ciascun figlio nella stessa riga.  
 Nell'esempio seguente si presume che ogni figlio presenti l'attributo 
layout_flexGrow impostato a 
1, pertanto lo spazio restante viene distribuito equamente tra di loro. 
 <android .support.design.widget.TextInputLayout android:layout_width="100dp" android:layout_height="wrap_content" app:layout_flexgrow="1">
 Puoi anche andare a vedere il file 
layout xml completo nel repository GitHub. 
Integrazione con RecyclerView 
Un altro vantaggio di 
FlexboxLayout è la sua integrazione con 
RecyclerView. Nell'ultima release della 
versione alfa, il nuovo 
FlexboxLayoutManager estende 
RecyclerView.LayoutManager, infatti ti consente sfruttare le funzionalità di Flexbox in un contenitore a scorrimento in modo molto più efficiente per la memoria.  
 Ricorda che puoi comunque ottenere un contenitore a scorrimento Flexbox utilizzando 
FlexboxLayout e andando a capo con 
ScrollView. Ma probabilmente ti ritroverai degli elementi superflui o anche un OutOfMemoryError se il numero di elementi presenti nel layout è grande, poiché 
FlexboxLayout non tiene in considerazione il riciclo delle visualizzazioni che fuoriescono dallo schermo quando l'utente lo fa scorrere.  
 Per informazioni più dettagliate su RecyclerView, ti invitiamo a guardare i video prodotti dal team Android UI toolkit, come  
1, 
2.  
 Un esempio concreto dell'utilità dell'integrazione  con 
RecyclerView riguarda le app Google Foto o Google News, in quanto entrambe prevedono un elevato numero di elementi che devono gestire larghezze diverse.  
 Puoi vederne un esempio nella 
versione demo dell'applicazione nel repository 
FlexboxLayout. Infatti, in questo repository, ogni immagine mostrata in 
RecyclerView presenta una larghezza diversa. Ma impostando flexWrap su "a capo",  
FlexboxLayoutManager layoutManager = new FlexboxLayoutManager(); layoutManager.setFlexWrap(FlexWrap.WRAP);
e impostando l'attributo 
flexGrow (come avrai notato, puoi configurare gli attributi utilizzando 
FlexboxLayoutManager e 
FlexboxLayoutManager.LayoutParams per gli attributi figli invece di configurarli da XML) su un valore positivo per ciascun figlio, 
void bindTo(Drawable drawable) { mImageView.setImageDrawable(drawable); ViewGroup.LayoutParams lp = mImageView.getLayoutParams(); if (lp instanceof FlexboxLayoutManager.LayoutParams) { FlexboxLayoutManager.LayoutParams flexboxLp = (FlexboxLayoutManager.LayoutParams) mImageView.getLayoutParams(); flexboxLp.setFlexGrow(1.0f); } }potrai notare che ogni immagine si adatta perfettamente al layout, indipendentemente dall'orientamento dello schermo.  
Per alcuni esempi completi di FlexboxLayout, vai a vedere: 
Novità in arrivo
Consulta la 
documentazione completa per vedere altri attributi che ti consentono di creare layout flessibili perfetti per le tue esigenze. Siamo molto contenti di ricevere i tuoi commenti e, in caso di eventuali problemi o richieste di funzionalità, ti preghiamo di segnalare un 
problema sul repository di GitHub.