2015年6月11日木曜日

レイアウトはどこからやってくるか

レイアウトの旅

レイアウトをどこで設定して、どこで読み取って、どこでインスタンス化しているのかの話。

Inflate

インフレ・デフレという言葉が示すように、Inflateとはなにかをでっかくすることだ。ジンバブエな。
AndroidでInflateといえば、レイアウトデータをレイアウトインスタンスにふくらませることだ。

レイアウトデータ

レイアウトデータはxmlだ。
xmlはHTMLで触れたことある?あるな?よっしゃ、

<LinearLayout
    android:layout_width="wrap_content" 
    ... >
   <TextView 
       android:text="Hello Big Gorilla!" 
       ... />
</<LinearLayout>

こんなかんじ。それを

GorillaProject/res/layout/my_cool_layout.xml

のような場所にいい感じの名前で格納する。
(ファイル名として使える文字に厳しい制限があるゾ)

レイアウトインスタンス

View root = inflater.inflate(R.layout.my_cool_layout);

inflaterってなに?というキミの当然浮かぶであろう疑問は無視するとして、これによってrootには先のレイアウトデータで定義したなかの「最も親のView」 = LinearLayoutのインスタンスが格納される。

そう、LinearLayoutのインスタンスだ。だから、

LinearLayout layout = (LinearLayout) root;

ができる。

inflateでは、xmlファイルという指示書に従って、Viewのインスタンスをnewしていくというわけだ。

Inflateなんてないじゃん

あるActivityでは、こんなふうに書かれている。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_cool_layout);
}

こういうときはsetContentViewのなかでInflate処理しているんだよ。大丈夫。
Inflateを内部的に呼び出している関数はたくさんあるよ。