2010-11-01 3 views
95

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

Можно ли это сделать, или я должен попытаться использовать LinearLayout, когда смогу, с точки зрения производительности/передового опыта?

Спасибо!

ответ

124

В разговоре с Google I/O 2013 («Написание пользовательских представлений для Android») Ромен Гай разъяснил недоразумение, которое заставило всех начать использовать RelativeLayouts для всего. RelativeLayout всегда должен выполнять два прохода. В целом это незначительно, если ваша иерархия просмотров проста. Но если ваша иерархия сложна, выполнение дополнительной меры может потенциально быть довольно дорогостоящим. Кроме того, если вы вставляете RelativeLayouts, вы получаете экспоненциальный алгоритм измерения.

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

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

+7

Я знаю, что это старый пост, но что бы вы считали наименее дорогостоящим решением при выборе между одним релятивизационным и 2-3 линееклитами? – Langkiller

+2

A ConstraintLayout :) – moyheen

50

Если вы не используете много видов (например, в ListView), производительность выбора между LinearLayout или RelativeLayout незначительна. Выберите то, что наиболее удобно использовать для работы, и беспокоиться о производительности только тогда, когда вам нужно.

А вот что официальные документы о Creating Efficient Layouts говорит о выполнении RelativeLayout и LinearLayout:

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

+3

оправдание этому незначительно? Я нашел это, в котором указано, что relativeLayout стоит больше, как я подозревал. https://bitbucket.org/spencerelliott/mercury/issue/1/changing-relativelayout-to-linearlayout – max4ever

+0

Просто избегайте добавления внутренних контейнеров. –

-15

Вы можете попробовать

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

2

Relativelayout более эффективен, чем Linearlayout.

От here:

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

+2

@phreakhead Вы правы, что нет единого «правильного» решения. Именно поэтому «правильное» решение почти всегда полностью забывает о производительности и делает все, что проще всего писать и читать. –

+1

эта цитата не поддерживает ваше утверждение, что верно только в одной ситуации. –

+0

На самом деле, дизайн вашего макета всегда пытается свести к минимуму количество уровней иерархии (макет внутри макета внутри макета) и проверить инструмент просмотра иерархии, чтобы найти потенциальные проблемы. –

Смежные вопросы