FrameLayoutでViewを複数登録するだけならmergeタグを使う

速度・電力消費も考えて、レイアウトをシンプルにする手助け。

Android Developersに書いてあった内容。
ADT-16になってlintが導入されたから気づいた。

使用理由

パッと見ると難しい。
というか何がいいのかわからない人もいると思う。
構成がキレイになるとか、好きなやつだけそうすればいいじゃん!!

そうじゃない。
レイアウトの構成が単純になればなるほど、表示が速くなる。
つまり動作可能な環境が増えるし、電力消費も減るのだ。

じゃあどういう時に使うのさ?

とにもかくにも、どういう変化があるのかこの目で確かめてみることにする。

こんな感じでリストの下にいくつかボタンを配置したりするときの話。
(普通は半透過のボタンにするだろうけど検証用なので・・・)

まずはFrameLayoutによるレイアウト構成でやってみる。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
 
    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
 
    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal|bottom"
        android:text="@string/button" />
</FrameLayout>
 
DDMSのレイアウト・ビューを使って確認してみる。
先の説明サイトの通り、このまま表示していると余計なFrameLayoutが1つ挿入されているのがわかる。

これをmergeタグに変更すると以下のようになる。
不要なFrameLayoutが無くなっていることが見てわかる。
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
 
    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
 
    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal|bottom"
        android:text="@string/button" />
</merge>
 

FrameLayoutが減ることによる恩恵

FrameLayoutのようなViewGroupの処理は内部に持つViewの管理である。
このソース、見てみればわかるが結構メンドウそうな処理郡だ。
  • Viewを管理するためのArrayList<View>
  • それを動作させるための各種メソッド(onLayout())
  • など
これが描画されるたびに実行されていく。
もちろん、無駄なFrameLayoutも例外ではない。

描画時間が増える上に、無駄なメモリも支払い、結果同じ表示。
ViewGroupの表示コスト分だけ電力消費も支払うことになる。
こんなところでも電力消費を抑え、減らすことができるというわけだ。



最終更新:2012年02月01日 02:27