Un RelativeLayout è più costoso di un LinearLayout?


114

Ho sempre utilizzato RelativeLayout ogni volta che avevo bisogno di un contenitore View, a causa della sua flessibilità, anche se volevo solo visualizzare qualcosa di veramente semplice.

Va bene farlo o dovrei provare a utilizzare un LinearLayout quando posso, dal punto di vista delle prestazioni / delle buone pratiche?

Grazie!

Risposte:


149

In un discorso al Google I / O 2013 (Writing Custom Views for Android), Romain Guy ha chiarito l'equivoco che ha indotto tutti a iniziare a utilizzare RelativeLayouts per tutto. Un RelativeLayout deve sempre eseguire due passaggi di misura. Nel complesso è trascurabile fintanto che la tua gerarchia di visualizzazione è semplice. Ma se la tua gerarchia è complessa, eseguire un passaggio di misurazione aggiuntivo potrebbe essere potenzialmente piuttosto costoso. Inoltre, se annidi RelativeLayouts, ottieni un algoritmo di misurazione esponenziale.

https://www.youtube.com/watch?v=NYtB6mlu7vA&t=1m41s

https://www.youtube.com/watch?v=NYtB6mlu7vA&t=38m04s


8
So che questo è un vecchio post, ma quale considereresti la soluzione meno costosa quando scegli tra un singolo layout relativo e 2-3 layout lineari?
Langkiller

5
A ConstraintLayout :)
moyheen

52

A meno che tu non stia disponendo molte viste (ad esempio in un ListView), le prestazioni di scelta tra LinearLayout o RelativeLayout sono trascurabili. Scegli quello che è più comodo da usare per il lavoro e preoccupati delle prestazioni solo quando necessario.

Ed ecco cosa dicono i documenti ufficiali sulla creazione di layout efficienti sulle prestazioni di RelativeLayout e LinearLayout:

Attenersi alle funzionalità di base purtroppo non è il modo più efficiente per creare interfacce utente. Un esempio comune è l'abuso di LinearLayout, che porta a una proliferazione di visualizzazioni nella gerarchia delle visualizzazioni. Ogni visualizzazione - o peggio, ogni gestore di layout - che aggiungi alla tua applicazione ha un costo: l'inizializzazione, il layout e il disegno diventano più lenti. Il passaggio del layout può essere particolarmente costoso quando si annidano diversi LinearLayout che utilizzano il parametro weight, che richiede che il figlio venga misurato due volte.


3
la giustificazione per essere trascurabile? ho trovato questo che afferma relativeLayout costa di più proprio come sospettavo bitbucket.org/spencerelliott/mercury/issue/1/…
max4ever

Basta evitare di aggiungere contenitori interni.
Luis Pena

2

Relativelayout è più efficace di Linearlayout.

Da qui :

È un'idea sbagliata comune che l'utilizzo delle strutture di layout di base porti ai layout più efficienti. Tuttavia, ogni widget e layout che aggiungi all'applicazione richiede inizializzazione, layout e disegno. Ad esempio, l'utilizzo di istanze nidificate di LinearLayout può portare a una gerarchia di visualizzazione eccessivamente profonda. Inoltre, annidare diverse istanze di LinearLayout che utilizzano il parametro layout_weight può essere particolarmente costoso poiché ogni figlio deve essere misurato due volte. Ciò è particolarmente importante quando il layout viene gonfiato ripetutamente, ad esempio quando viene usato in un ListView o GridView.


2
@phreakhead Hai ragione che non esiste un'unica soluzione "corretta". Questo è il motivo per cui la soluzione "corretta" è quasi sempre quella di dimenticare completamente le prestazioni e fare tutto ciò che è più facile da scrivere e leggere.
Kevin Krumwiede

3
quella citazione non conferma la tua affermazione, il che è vero solo in una situazione
Flo We

La verità è che progetta il tuo layout cercando sempre di ridurre al minimo il numero di livelli gerarchici (layout all'interno del layout all'interno del layout) e controlla lo strumento di visualizzazione della gerarchia per trovare potenziali problemi.
Alexander Haroldo da Rocha

1

AGGIORNAMENTO 2018: nella versione N di Android, la ConstraintLayoutclasse fornisce funzionalità simili a RelativeLayout, ma a un costo notevolmente inferiore. È un gestore di layout molto potente e dovrebbe essere utilizzato ogni volta che è necessario creare una GUI complessa.


dall'ultima versione è diventato molto molto lento
Dragos Rachieru

Dipende da come viene utilizzato. Dovresti evitare il posizionamento assoluto e utilizzare i vincoli.
akelec

-25

Puoi provare

<LinearLayout>
       <ViewPager/><!--Loading images from net, it is very good as a testing case.-->
       <ViewPagerIndicator/>
       <TextView/> <!--Show some info about page-->
</LinearLayout>

<RelativeLayout>           
       <ViewPager/><!--Loading images from net, it is very good as a testing case.-->
       <ViewPagerIndicator below="id of ViewPager"/>
       <TextView below="id of ViewPagerIndicator"/> <!--Show some info about page-->
</RelativeLayout>

Scoprirai che ce ne sono molti diversi, se le tue pagine caricano alcune immagini da Internet. In questo caso LinearLayout è migliore del 100% rispetto a RelativeLayout di sempre.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.