Posted at

2年目ポケモントレーナー系SEのandroidアプリ開発まとめ〜2日目〜


はじめに

android開発まとめ2日目です。

今回はActivity#setContentView<merge>の使い方についてです。

レイアウトの扱い方、きちんと説明できなかったので勉強してきました。


Activity#setContentView

今回の使用例


sample

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_next);

関数呼び出しのパターンと用途は以下の通り。

1. setContentView (View view, ViewGroup.LayoutParams params)

    Set the activity content to an explicit view.

2. setContentView (View view)

    Set the activity content to an explicit view.

3. setContentView (int layoutResID)

    Set the activity content from a layout resource.


参考:https://developer.android.com/reference/android/app/Activity

1.2は、引数で渡したViewをレイアウトに反映させる。

3が今回使用したパターン。引数で渡したレイアウトファイルをActivityに読み込ませる。

アクティビティの実体のオブジェクトに対して、setContentViewでxmlを読み込ませているイメージ。

お作法的にこの関数を実行しなければいけないのかと思っていたが、これがなくても実行できた。

setContentView (int layoutResID)をonCreate内で実行していないと、レイアウトを読み込んでいないため、下の画像見たいな真っ白い画面が表示される。

スクリーンショット 2019-01-03 16.11.04.png

1.2は後からViewを追加表示させるために、

3は最初にベースとなるActivityを表示させるために使用すると考えていいだろう。


<merge>

includeするxmlを親のViewと合体するのに使用する。

「それって何がお得なの?」と思った方、僕と同じです。なんとか理解できたので解説いたします。

まず、前提としてincludeする側の親レイアウトには、ビューグループが必要です。

そのため、超簡略化すると下記のような構成になるはずです。


parent.xml

<LinearLayout>

<include~~~~~/>
</LinearLayout>

※便宜上LinearLayoutを使用しましたが、ビューグループであればなんでもいいです。

そして、この<include~~~~~/>には、子レイアウトが入ってきます。

この時、<merge>ではなくビューグループを使用した場合、こんな感じになります。


childLayout1.xml

<LinearLayout>

<TextView~~~~~/>
<TextView~~~~~/>
<TextView~~~~~/>
</LinearLayout>

そして、includeして合体が完了すると、下記のようになります。


mergedLayout1.xml

<LinearLayout>

<LinearLayout>
<TextView~~~~~/>
<TextView~~~~~/>
<TextView~~~~~/>
</LinearLayout>
</LinearLayout>

お気づきでしょうか。

LinearLayoutの中に無駄なLinearLayoutが存在して、とってもイケてません。

<merge>を使用した場合の子レイアウトは、下記のようになります。


childLayout2.xml

<merge>

<TextView~~~~~/>
<TextView~~~~~/>
<TextView~~~~~/>
</merge>

そして、合体!!


mergedLayout2.xml

<LinearLayout>

<TextView~~~~~/>
<TextView~~~~~/>
<TextView~~~~~/>
</LinearLayout>

こうなります。先ほどのレイアウトから無駄がなくなりましたね。

<merge>は、こんな感じで、親のViewGroupと合体してもらうために使用するんですね〜。


まとめ

今日はActivity#setContentView<merge>についてでした。

改めて調べると、わかっている気になっているものがたくさんありますね。

今後もandroidで疑問に思ったことを調べてまとめていきます〜。

読んでいただきありがとうございます。