Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

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で疑問に思ったことを調べてまとめていきます〜。
読んでいただきありがとうございます。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away