Чи є відносний макет дорожчим, ніж LinearLayout?


114

Я завжди використовував RelativeLayout кожен раз, коли мені потрібен був контейнер View, через його гнучкість, навіть якщо я просто хотів показати щось дійсно просте.

Чи добре це робити, або я повинен спробувати використовувати LinearLayout, коли можу, з точки зору ефективності / передового досвіду?

Дякую!

Відповіді:


149

У бесіді в Google I / O 2013 (Написання користувацьких поглядів для Android) Ромен Гай роз'яснив непорозуміння, що змусило всіх почати використовувати RelativeLayouts для всього. Відносна схема завжди повинна робити два проходи. Загалом це мізерно мало, доки ваша ієрархія перегляду проста. Але якщо ваша ієрархія складна, то проходження додаткової міри може бути досить дорогим. Крім того, якщо ви вкладаєте RelativeLayouts, ви отримуєте експоненціальний алгоритм вимірювання.

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

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


8
Я знаю, що це стара публікація, але що б ви вважали найменш затратним рішенням при виборі між однією відносною версією та 2-3 лінійними верстатами?
Лангкіллер

5
A ConstraintLayout :)
moyheen

52

Якщо ви не викладаєте безліч переглядів (наприклад, у ListView), ефективність вибору між LinearLayout або RelativeLayout незначна. Вибирайте те, що найзручніше використовувати для роботи, і турбуйтеся про продуктивність лише тоді, коли вам потрібно.

А ось що говорять офіційні документи про створення ефективних макетів щодо продуктивності RelativeLayout та LinearLayout:

На жаль, дотримання основних функцій, на жаль, не є найбільш ефективним способом створення користувальницьких інтерфейсів. Поширений приклад - зловживання LinearLayout, що призводить до поширення поглядів в ієрархії перегляду. Кожен перегляд - або ще гірше, кожен менеджер макета - який ви додаєте до своєї програми, коштує: ініціалізація, компонування та малювання стають повільнішими. Пропуск макета може бути особливо дорогим, коли ви вкладете кілька LinearLayout, які використовують параметр ваги, який вимагає вимірювання дитини вдвічі.


3
виправдання для цього є незначним? Я виявив, що це говорить, що відносний макет
max4ever

Просто уникайте додавання внутрішніх контейнерів.
Луїс Пена

2

Відносна прокладка більш ефективна, ніж Linearlayout.

Від сюди :

Поширена помилкова думка, що використання основних структур компонування призводить до найбільш ефективних схем. Однак кожен віджет та макет, які ви додаєте у свою програму, потребують ініціалізації, компонування та малювання. Наприклад, використання вкладених екземплярів LinearLayout може призвести до надмірно глибокої ієрархії перегляду. Крім того, вкладати кілька екземплярів LinearLayout, які використовують параметр layout_weight, може бути особливо дорогим, оскільки кожну дитину потрібно виміряти вдвічі. Це особливо важливо, коли макет багаторазово завищений, наприклад, коли використовується в ListView або GridView.


2
@phreakhead Ви праві, що немає єдиного "правильного" рішення. Ось чому «правильне» рішення майже завжди повністю забути про продуктивність і зробити все, що найпростіше писати і читати.
Кевін Крумвіде

3
ця цитата не підкріплює ваше твердження, що вірно лише в одній ситуації
Flo We

Справді, спроектуйте ваш макет завжди намагаючись мінімізувати кількість рівнів ієрархії (макет усередині макета всередині макета) та перевірити інструмент перегляду ієрархії, щоб знайти потенційні проблеми.
Олександр Гарольдо да Роша

1

ОНОВЛЕННЯ 2018 року: У N випуску Android ConstraintLayoutклас надає функціональність, аналогічну RelativeLayout, але за значно нижчої ціни. Це дуже потужний менеджер компонування, і його слід використовувати, коли необхідно створити складний графічний інтерфейс.


з останньої версії це стало дуже повільно
Драгош Рахіє

Це залежить від того, як він використовується. Вам слід уникати абсолютного позиціонування та використовувати обмеження.
akelec

-25

Ви можете спробувати

<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>

Ви побачите, що ваші сторінки завантажують зображення з Інтернету, є багато різних. У цьому випадку LinearLayout на 100% кращий, ніж RelativeLayout коли-небудь.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.