2. Android学習 Layout、View編

**勉強できること**
LayoutとViewの関係性
基本的なLayout、Viewの種類

**前提**
AndroidStudioのバージョン：4.0.1
言語：Java

# 1. HelloWorldの実装内容の確認
前回の1. Android学習 AndroidStudioのインストール〜HelloWorld編 からの続きとなります。
上記で作成したプロジェクトを開きます。
MainActivityファイルを開きます。
このファイルがアプリの土台となっているActivityクラスとなります。
（Activityについては別の章で説明する予定なので、ここでは割愛します）

MainActivityファイルには下記のようにコードが書かれています。
末尾の行の"setContentView(R.layout.activity_main);"が
アプリで表示するレイアウトファイルを指定するコードです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718108/0b10e917-7599-2de2-e372-37acc275608e.png)

レイアウトのmain_activityファイルを開きます。
初期設定されているレイアウトが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718108/157398fb-d260-77a6-5eca-795b67f7634c.png)

右上のタブで「Split」に切り替え、コードとレイアウトの両方が確認できる表示にします。
レイアウトはXMLでの記述となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718108/da8e23f7-8764-2e2b-d214-e03a6f62308d.png)
Androidの画面レイアウトは基本的にLayout（土台） + View（パーツ）という構成となります。
初期設定のレイアウトの場合だと、
まず１行目にXMLの宣言を記述します。
（新しくファイルを作成する際は自動的に挿入されるため、あまり意識する必要はないです）
2行目に記載されている「androidx.constraintlayout.widget.ConstraintLayout〜」が土台となるレイアウトになります。
そのレイアウトに入れ子になっているもの（9行目から記載されているTextView）がViewです。

### レイアウトの詳細
レイアウトの詳細な設定を見ていきます。
ConstraintLayoutは、Viewに対してConstraint(制約)を設定して画面を構成するレイアウトになります。
あるViewの上にこのViewを設置して、さらにそのViewの右にはこのViewを設置するという構成になります。
（少し慣れるまでは難しいので、後述の「２. Layoutの種類」で紹介するLinearLayoutなどの
扱いやすいものから初めていくといいかもしれません。）

```java:main_activity.xml
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android" //①
    xmlns:app="http://schemas.android.com/apk/res-auto" //①
    xmlns:tools="http://schemas.android.com/tools" //①
    android:layout_width="match_parent" //②
    android:layout_height="match_parent" //②
    tools:context=".MainActivity"> //③
```

①XMLの名前空間の定義
XMLの名前空間を定義し、設定ファイルのタグや属性が正しく認識されるようにしています。

②レイアウトのサイズ設定
android:layout_width・・・レイアウトの横幅を指定します。
android:layout_height・・・レイアウトの高さを指定します。
この設定項目の設定値としては下記のような設定が可能です。

|設定値|詳細|
|:--|:--|
|match_parent|表示できる最大のサイズで表示します。<br>土台となるLayoutであれば画面最大まで表示し、<br>子のViewであれば、親のLayout,Viewと同じサイズにします（最大）|
|wrap_content|中身を表示するのに十分なサイズを表示します。|
|数値の指定|指定する単位はdpで、200dpといった感じで指定します。※|

※ dpは端末の解像度に依存しない単位となります。
Androidは様々な解像度の端末が存在しており、どの端末で見てもレイアウトが崩れないようにするため、このdpを使って指定する必要があります。
dp以外にもpxで指定することも可能ですが、pxだと端末の解像度に依存するため端末により見え方が異なります。
基本的に数値を指定する場合はこのdpを指定してレイアウトを作成します。

③Activityとの関連付け
レイアウトを関連付けるActivityを指定します。

### Viewの詳細
次にViewの詳細な設定を見ていきます。
TextViewなのでその名の通り、文字を表示するViewとなります。

```java:main_activity.xml
    <TextView
        android:layout_width="wrap_content" //④
        android:layout_height="wrap_content" //④
        android:text="Hello World!" //⑤
        app:layout_constraintBottom_toBottomOf="parent" //⑥
        app:layout_constraintLeft_toLeftOf="parent" //⑥
        app:layout_constraintRight_toRightOf="parent" //⑥
        app:layout_constraintTop_toTopOf="parent" /> //⑥
```

④Viewのサイズ設定
レイアウトで説明したものと同じ属性となります。
wrap_contentが指定されているので、中身の"Hello World!"という文字列を表示することが可能なサイズとなっています。
エディターのデザインの"Hello World!"にカーソルを当てるとViewの大きさがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718108/340800f4-c191-fa2e-63ad-34db01bf5cd3.png)

⑤表示する文字を設定
textに表示する文字を指定します。

⑥Viewの配置設定
親のレイアウトがConstraintLayoutなので、Viewの配置設定（制約設定）が必要となります。
他のレイアウトの場合はそのレイアウトに応じた設定が必要となる場合があります。
ConstraintLayoutの制約はViewのどの辺にどのViewを設置するかという制約があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718108/8917a4aa-d8da-da75-4ab4-8c7bafd14950.png)

TextViewの「layout_constraintBottom_toBottomOf="parent"」場合は、
TextViewの下辺に親レイアウトの下辺が設定されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718108/4190f3ff-501e-f42c-bbd4-400dc77f8ffe.png)

他の属性も同じように設定されています。
この場合、親(parent)に対して中央に配置する制約となります。

試しに「layout_constraintBottom_toBottomOf="parent"」という制約を消してみます。
縦の中央配置の制約がなくなり、親レイアウトの上辺に配置され、
横の中央配置の制約は残ったままなので、横位置は中央配置のままとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718108/2034b873-b680-91ae-cf9d-715af3032e49.png)

他にも色々な制約がありますが、一旦ここまでの説明とします。

# ２. Layoutの種類
次に基本的なLayoutの種類を紹介します。
レイアウトには大きく2種類あり、それぞれの特徴は下記の通りです。

|Layoutの種類|Layout名|概要|イメージ|
|:--|:--|:--|:-:|
|線形レイアウト|LinearLayout|すべての子ビューを、垂直または水平の一方向に揃えるレイアウトです。<br>|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718108/9e8da874-8c78-aa23-5f9f-e625f1dc0df1.png)|
|相対レイアウト|RelativeLayout<br>ConstraintLayout|Viewの位置を相対的に指定するレイアウトです。<br>２つレイアウトを紹介しましたが、ConstraintLayoutの方がパフォーマンスが優れているためConstraintLayoutを使って開発することをお勧めします。|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718108/bbd85b66-ffe5-e954-c92f-5adb12a70385.png)|

# ３. Viewの種類
最後に基本的なViewの種類を紹介します。

|View名|概要|イメージ|
|:--|:--|:-:|
|TextView|テキストを表示するViewです。|   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718108/5874975b-28d0-2320-e614-c4265569a8a6.png)|
|ImageView|画像を表示するViewです。|   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718108/6d7618ce-7263-e683-22a8-74b2e74f6654.png)|
|Button|ボタンを表示するViewです。|   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718108/0ef1bc63-2df7-1e7c-196b-bd5b5922de50.png)|
|WebView|Webページを表示するViewです。|   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718108/783841af-58d3-3d3f-3227-ff662590a623.png)|

上記で紹介したLayout,View以外にも様々な種類があります。
開発しながら触っていくとだんだんそれぞれの特徴がわかってくるので、
作りたいレイアウトに応じて適したLayout、Viewを見つけてみてください。

今回はここまでとなります。
お疲れさまでした！d(´∀｀)b