Это уровень мельче, дороже, чем макет?


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

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

спасибо!

5 106

5 ответов:

в разговоре на 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

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

а вот о чем официальные документы Создание Эффективных Макетов говорит о производительности RelativeLayout и LinearLayout:

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

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

с здесь:

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

обновить 2018: в выпуске N Android,ConstraintLayout класс предоставляет аналогичную функциональность RelativeLayout, но по значительно более низкой стоимости. Это очень мощный менеджер макетов, и он должен использоваться всякий раз, когда необходимо построить сложный графический интерфейс.

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

<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 когда-либо.