RelativeLayoutはLinearLayoutよりも高価ですか?


114

非常にシンプルなものを表示したいだけでも柔軟性があるため、Viewコンテナが必要になるたびに常にRelativeLayoutを使用してきました。

パフォーマンス/グッドプラクティスの観点から、そうしてもいいですか、それともできる限りLinearLayoutを使用してみるべきですか?

ありがとう!

回答:


149

Romain Guyは、Google I / O 2013(Wr​​iting Custom Views for Android)での講演で、誰もがRelativeLayoutsをあらゆるものに使い始める原因となった誤解を明らかにしました。RelativeLayoutは常に2つの測定パスを実行する必要があります。全体的には、ビューの階層が単純である限り無視できます。ただし、階層が複雑な場合、追加のメジャーパスを実行すると、かなりのコストがかかる可能性があります。また、RelativeLayoutsをネストすると、指数測定アルゴリズムが得られます。

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

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


8
私はこれが古い投稿であることを知っていますが、単一の相対レイアウトと2〜3の線形レイアウトのどちらを選択する場合、最もコストのかからない解決策は何だと思いますか?
Langkiller

5
A ConstraintLayout :)
moyheen 2017年

52

多数のビューをレイアウトしている場合(リストビューなど)を除き、LinearLayoutまたはRelativeLayoutのどちらを選択してもパフォーマンスはごくわずかです。仕事に使うのに最も便利な方を選び、必要なときにだけパフォーマンスを気にしてください。

そして、これは効率的なレイアウトの作成に関する公式ドキュメントがRelativeLayoutとLinearLayoutのパフォーマンスについて述べていることです:

基本的な機能にこだわるのは残念ながら、ユーザーインターフェイスを作成する最も効率的な方法ではありません。一般的な例は、LinearLayoutの乱用です。これにより、ビュー階層のビューが急増します。アプリケーションに追加するすべてのビュー、またはさらに悪いことに、すべてのレイアウトマネージャーは、初期化、レイアウト、描画が遅くなるという犠牲を伴います。子を2回測定する必要がある、重みパラメータを使用するいくつかのLinearLayoutをネストする場合、レイアウトパスは特に高価になる可能性があります。


3
無視できることの正当化?これを見つけたのは、relativeLayoutのコストがbitbucket.org/spencerelliott/mercury/issue/1/…を
max4ever

内部コンテナの追加は避けてください。
Luis Pena 2014

2

RelativelayoutはLinearlayoutよりも効果的です。

ここから:

基本的なレイアウト構造を使用することが最も効率的なレイアウトにつながるというのは、よくある誤解です。ただし、アプリケーションに追加する各ウィジェットとレイアウトには、初期化、レイアウト、および描画が必要です。たとえば、LinearLayoutのネストされたインスタンスを使用すると、ビューの階層が過度に深くなる可能性があります。さらに、layout_weightパラメーターを使用するLinearLayoutのいくつかのインスタンスをネストすると、各子を2回測定する必要があるため、特にコストがかかる可能性があります。これは、ListViewやGridViewで使用する場合など、レイアウトが繰り返し拡張される場合に特に重要です。


2
@phreakhead単一の「正しい」解決策はないというのはあなたの言う通りです。これが、「正しい」ソリューションがほとんど常にパフォーマンスを完全に忘れて、書き込みと読み取りが最も簡単なことを何でも行う理由です。
Kevin Krumwiede、2015

3
その引用はあなたの発言を裏付けるものではありません。これはある状況でのみ当てはまります
Flo We

真実は、常に階層レベル(レイアウト内のレイアウト内のレイアウト)の数を最小化するようにレイアウトを設計し、潜在的な問題を見つけるために階層ビューアーツールをチェックすることです。
アレクサンダーハロルドダロシャ

1

2018年更新: AndroidのNリリースでは、ConstraintLayoutクラスはと同様の機能を提供しますRelativeLayoutが、大幅にコストが低くなります。これは非常に強力なレイアウトマネージャであり、複雑なGUIを構築する必要があるときはいつでも使用する必要があります。


最新バージョン以降、非常に遅くなりました
Dragos Rachieru

使い方によって異なります。絶対配置を避け、制約を使用する必要があります。
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はRelativeLayoutよりも100%優れています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.