Androidアプリの画面レイアウトをLinearLayoutでデザインする

AndroidアプリのLinearLayoutを使って画面のレイアウトをデザインする

Androidアプリの画面レイアウトをLinearLayoutを使ってデザインします。Androidにはいくつかのレイアウトパターンがあり、それぞれにメリット・デメリットがあります。中でもLinearLayoutはとてもシンプルでわかりやすく、デザインしやすいレイアウトパターンです。


LinearLayoutで画面デザインをするやり方を解説します。

新規プロジェクトを作成しLinearLayoutを適用する

新規プロジェクトを立ち上げ、activity_main.xml画面右下のTextタブをクリックします。Android Studioは新規プロジェクトを立ち上げると、デフォルトでConstraintLayoutというレイアウトパターンが採用されます。
ConstraintLayoutは自由度が高いレイアウトですが、今回はLinearLayoutを利用します。

Android Studio 新規プロジェクト立ち上げ時のレイアウト

以下のようなxmlコードが書かれていると思います。

<?xml version=”1.0″ encoding=”utf-8″?>

<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”>


<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” />


</androidx.constraintlayout.widget.ConstraintLayout>

以下のように書き換えます。

<?xml version=”1.0″ encoding=”utf-8″?>

<LinearLayout

xmlns:android=”http://schemas.android.com/apk/res/android”

xmlns:tools=”http://schemas.android.com/tools”

android:layout_width=”match_parent”

android:layout_height=”match_parent”

tools:context=”.MainActivity” >


<TextView

android:id=”@+id/text_view01″

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:text=”text_view01″

android:background=”#9999ff”

/>


<TextView

android:id=”@+id/text_view02″

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:text=”text_view02″

android:background=”#99ff99″

/>


</LinearLayout>

プレビューを見ると次のように表示されています。

ConstraintLayoutをLinearLayoutに書き換える

LinearLayoutタグの中に入れ子で配置された画面部品(ビュー)を一直線に並べるレイアウトです。LinearLayoutタグのandroid:orientation属性にhorizontal・verticalを指定することで、レイアウトの方向を水平・垂直と切り替えられます。具体的には「android:orientation=”horizontal”」(水平方向)・「android:orientation=”vertical”」(垂直方向)とします。これらが書かれていない場合は自動的に水平方向だと見なされます。
またLinearLayoutはさらにLinearLayoutを入れ子構造にすることができ、通常は複数階層の入れ子にしてデザインしていくことが多いと思います。
以下は水平と垂直方向を混ぜたレイアウトのサンプルです。
android:layout_width・android:layout_heightの属性値として「match_parent」と「wrap_content」が指定してあります。match_parentは「親要素のサイズに合わせる」、wrap_contentは「子要素に合わせて変化する」というものです。一番親になるLinearLayoutタグで幅・高さにmatch_parentが指定されていますので、画面いっぱいの領域を取ることになります。

<?xml version=”1.0″ encoding=”utf-8″?>

<LinearLayout

xmlns:android=”http://schemas.android.com/apk/res/android”

xmlns:tools=”http://schemas.android.com/tools”

android:layout_width=”match_parent”

android:layout_height=”match_parent”

android:orientation=”vertical”

tools:context=”.MainActivity” >


<LinearLayout

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:orientation=”vertical” >


<TextView

android:id=”@+id/text_view01″

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:text=”text_view01″

android:background=”#9999ff”

/>


<TextView

android:id=”@+id/text_view02″

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:text=”text_view02″

android:background=”#6666ff”

/>


<TextView

android:id=”@+id/text_view03″

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:text=”text_view03″

android:background=”#3333ff”

/>


</LinearLayout>


<LinearLayout

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:orientation=”horizontal” >


<TextView

android:id=”@+id/text_view04″

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:text=”text_view04″

android:background=”#99ff99″

/>


<TextView

android:id=”@+id/text_view05″

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:text=”text_view05″

android:background=”#66ff66″

/>


</LinearLayout>


</LinearLayout>

Android LinearLayoutの横並べと縦並べ

目次にもどる

View(ビュー)を配置する

Viewの位置を色々変えてみます。以下の2種類の属性値を指定するとビューの右詰め下詰め、中央揃えなどができます。

  • android:gravity属性:親要素に指定し、含まれる子要素の位置を一定方向に詰める。(値:left,right,top,bottom)
  • android:layout_gravity属性:指定した要素の位置を一定方向に詰める。(値:left,right,top,bottom)

注意したいのがビューが配置されている親要素のサイズです。gravityやlayout_gravityは親要素の中に余白がある場合に、余白の範囲内で位置を動かす属性です。よってここでは親要素にあたるLinearLayoutのlayout_width(水平方向の場合)とlayout_height(垂直方向の場合)の属性値をmatch_parentとしています。画面いっぱいの大きさになりますね。

<?xml version=”1.0″ encoding=”utf-8″?>

<LinearLayout

xmlns:android=”http://schemas.android.com/apk/res/android”

xmlns:tools=”http://schemas.android.com/tools”

android:layout_width=”match_parent”

android:layout_height=”match_parent”

android:orientation=”vertical”

tools:context=”.MainActivity” >


<LinearLayout

android:layout_width=”match_parent”

android:layout_height=”wrap_content”

android:gravity=”right”

android:orientation=”vertical” >


<TextView

android:id=”@+id/text_view01″

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:text=”text_view01″

android:background=”#9999ff”

/>


<TextView

android:id=”@+id/text_view02″

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:text=”text_view02″

android:background=”#6666ff”

android:layout_gravity=”left”

/>


<TextView

android:id=”@+id/text_view03″

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:text=”text_view03″

android:background=”#3333ff”

android:layout_gravity=”center”

/>


</LinearLayout>


<LinearLayout

android:layout_width=”wrap_content”

android:layout_height=”match_parent”

android:orientation=”horizontal” >


<TextView

android:id=”@+id/text_view04″

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:text=”text_view04″

android:background=”#99ff99″

android:layout_gravity=”bottom”

/>


<TextView

android:id=”@+id/text_view05″

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:text=”text_view05″

android:background=”#66ff66″

android:layout_gravity=”center”

/>


</LinearLayout>


</LinearLayout>

Android gravityとlayout_gravity

最初のLinearLayout要素は横いっぱいに領域を取っていますので、layout_gravity=”right”で右寄せになりました。2つ目のLinearLayoutは縦いっぱいに領域を取っています。

目次にもどる

View(ビュー)のサイズを比率で設定する

各View(ビュー)のサイズを幅や高さの比率で指定します。画面全体の各パーツの領域を簡単に設定でき、スマホ端末の画面サイズが変わっても対応できるので便利です。

<?xml version=”1.0″ encoding=”utf-8″?>

<LinearLayout

xmlns:android=”http://schemas.android.com/apk/res/android”

xmlns:tools=”http://schemas.android.com/tools”

android:layout_width=”match_parent”

android:layout_height=”match_parent”

android:orientation=”vertical”

tools:context=”.MainActivity” >


<LinearLayout

android:layout_width=”match_parent”

android:layout_height=”wrap_content”

android:orientation=”horizontal” >


<TextView

android:id=”@+id/text_view01″

android:layout_width=”0dp”

android:layout_height=”wrap_content”

android:text=”text_view01″

android:background=”#9999ff”

android:layout_weight=”1″

/>


<TextView

android:id=”@+id/text_view02″

android:layout_width=”0dp”

android:layout_height=”wrap_content”

android:text=”text_view02″

android:background=”#6666ff”

android:layout_weight=”1″

/>


<TextView

android:id=”@+id/text_view03″

android:layout_width=”0dp”

android:layout_height=”wrap_content”

android:text=”text_view03″

android:background=”#3333ff”

android:layout_weight=”1″

/>


</LinearLayout>


<LinearLayout

android:layout_width=”match_parent”

android:layout_height=”wrap_content”

android:orientation=”horizontal” >


<TextView

android:id=”@+id/text_view04″

android:layout_width=”0dp”

android:layout_height=”wrap_content”

android:text=”text_view04″

android:background=”#99ff99″

android:layout_weight=”1″

/>


<TextView

android:id=”@+id/text_view05″

android:layout_width=”0dp”

android:layout_height=”wrap_content”

android:text=”text_view05″

android:background=”#66ff66″

android:layout_weight=”1″

/>


<TextView

android:id=”@+id/text_view06″

android:layout_width=”0dp”

android:layout_height=”wrap_content”

android:text=”text_view06″

android:background=”#99ff99″

android:layout_weight=”2″

/>


<TextView

android:id=”@+id/text_view07″

android:layout_width=”0dp”

android:layout_height=”wrap_content”

android:text=”text_view07″

android:background=”#66ff66″

android:layout_weight=”2″

/>


<TextView

android:id=”@+id/text_view08″

android:layout_width=”0dp”

android:layout_height=”wrap_content”

android:text=”text_view08″

android:background=”#99ff99″

android:layout_weight=”3″

/>


</LinearLayout>


</LinearLayout>

Android layout_weightでサイズを比率で設定する

layout_weightの値でサイズの比率を決めることができます。
ポイントはlayout_weightを指定するパーツの幅(もしくは高さ)を0dpにするところです。layout_weightはサイズの比率を決めるのではなく、親要素の中にできた「余白を割り振る比率」を決めるものです。よってパーツのサイズを0にしておくことで、親要素のサイズがそのまま余白のサイズと考えられるわけです。
また各ビューのlayout_weightの値を同じ値にすると、その親要素の範囲内で余白の均等割り付けができます。

 

これらを組み合わせてることで自由自在にレイアウトができます。親要素ではじめに領域を確保することがポイントです。

<?xml version=”1.0″ encoding=”utf-8″?>

<LinearLayout

xmlns:android=”http://schemas.android.com/apk/res/android”

xmlns:tools=”http://schemas.android.com/tools”

android:layout_width=”match_parent”

android:layout_height=”match_parent”

android:orientation=”vertical”

tools:context=”.MainActivity” >


<LinearLayout

android:layout_width=”match_parent”

android:layout_height=”0dp”

android:orientation=”horizontal”

android:layout_weight=”1″ >


<TextView

android:id=”@+id/text_view01″

android:layout_width=”0dp”

android:layout_height=”match_parent”

android:text=”text_view01″

android:background=”#9999ff”

android:layout_weight=”1″

/>


<TextView

android:id=”@+id/text_view02″

android:layout_width=”0dp”

android:layout_height=”match_parent”

android:text=”text_view02″

android:background=”#6666ff”

android:layout_weight=”1″

/>


<TextView

android:id=”@+id/text_view03″

android:layout_width=”0dp”

android:layout_height=”match_parent”

android:text=”text_view03″

android:background=”#3333ff”

android:layout_weight=”1″

/>


</LinearLayout>


<LinearLayout

android:layout_width=”match_parent”

android:layout_height=”0dp”

android:orientation=”horizontal”

android:layout_weight=”4″ >


<LinearLayout

android:layout_width=”0dp”

android:layout_height=”match_parent”

android:orientation=”vertical”

android:layout_weight=”1″ >


<TextView

android:id=”@+id/text_view04″

android:layout_width=”match_parent”

android:layout_height=”match_parent”

android:text=”text_view04″

android:background=”#bbffbb”

/>


</LinearLayout>


<LinearLayout

android:layout_width=”0dp”

android:layout_height=”match_parent”

android:orientation=”vertical”

android:layout_weight=”3″ >


<TextView

android:id=”@+id/text_view05″

android:layout_width=”match_parent”

android:layout_height=”0dp”

android:text=”text_view05″

android:background=”#66ff66″

android:layout_weight=”1″

/>


<TextView

android:id=”@+id/text_view06″

android:layout_width=”match_parent”

android:layout_height=”0dp”

android:text=”text_view06″

android:background=”#99ff99″

android:layout_weight=”1″

/>


<TextView

android:id=”@+id/text_view07″

android:layout_width=”match_parent”

android:layout_height=”0dp”

android:text=”text_view07″

android:background=”#66ff66″

android:layout_weight=”1″

/>


</LinearLayout>


</LinearLayout>


</LinearLayout>

Android 画面全体をLinearLayoutでデザインする

目次にもどる

SNSでもご購読できます。


このエントリーをはてなブックマークに追加

コメントを残す

*