Viewを任意の位置に配置する
|Androidアプリケーションを始めて作成するときに、一番つまづきがちになるLayoutの構成の仕方。
本エントリでは、下記要素についての紹介を踏まえて、思い通りの位置にViewを構成する方法を紹介します。
今回紹介する要素
- android:layout_weight
- android:gravity
- android:layout_gravity
- android:layout_margin
- android:padding
今回のサンプルではこれらの要素を使用して、以下画面を作成します。
また、今回の記事の作成にあたり、以下サイトを参考にさせていただきました。
ありがとうございました。
zaki日記 様
http://zaki.tdiary.net/20110702.html#p01
プログラミング雑記 様
http://d.hatena.ne.jp/Korsakov/20100826/1282844943
それでは続きをどうぞ。
■gravityとlayout_gravity
LayoutやViewに対して、重力を掛けることで位置を調節する要素にgravityがあります。
gravityとlayout_gravityの違いは、サンプルの赤枠部分を見比べてください。
以下をポイントとして見比べてみましょう。
【gravity】
主に親Viewに指定し、子Viewに対して重力がかかる。
黄色のLinearLayoutに注目してください。(Line:1)
center_certicalを指定しているため、子ViewにあたるTextViewとButtonが中心に集まっています。
また、Textを表示するViewでは中のテキストの表示位置を変更させる役割も持ちます。
Line8のleftの指定により左詰、
Line9のrightの指定により右詰、
Line18のcenter_horizontalの指定により中寄になっています。
【layout_gravity】
対象のViewに直接指定。指定したViewに重力がかかる
center_horizontalの指定により、Buttonの表示位置が横方向の中心になっています。
<LinearLayout android:layout_height="match_parent" android:gravity="cente_vertical" android:layout_margin="30dip" android:orientation="vertical" android:background="@color/yellow" android:layout_weight="1" android:layout_width="0dip" android:id="@+id/linearLayout5"> <TextView android:layout_width="match_parent" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_height="wrap_content" android:text="TextView" android:id="@+id/textView1" android:gravity="left"></TextView> <TextView android:layout_width="match_parent" android:gravity="right" android:textAppearance="?android:attr/textAppearanceMedium" android:layout_height="wrap_content" android:text="TextView" android:id="@+id/textView2"></TextView> <TextView android:layout_width="match_parent" android:gravity="center_horizontal" android:textAppearance="?android:attr/textAppearanceSmall" android:layout_height="wrap_content" android:text="TextView" android:id="@+id/textView3"></TextView> <Button android:text="Button" android:id="@+id/button1" android:gravity="right" android:layout_gravity="center_horizontal" android:layout_marginBottom="5dip" android:layout_width="match_parent" android:layout_height="wrap_content"></Button> </LinearLayout>
■layout_marginとpadding
layout_margin要素とpadding要素はどちらもView間の空白を指定する為に使用する要素になります。
両者の違いは、
【padding】
親のViewに指定した場合、親Viewから子Viewが配置されるまでの距離を指定します。
水色のLinearLayoutの赤矢印に注目してください。(Line:4)
水色のLinearLayoutから、子ViewにあたるEditTextまでの距離(赤矢印)がpaddingの指定になります。
【layout_margin】
対象Viewの隣のViewまでの距離を指定します。
黄色のLinearLayoutの周りからの距離に注目してください。(Line:9)
引用の図では、黄色のLinearLayoutはEditTextよりも更に小さくなっています。
黄色のLinearLayoutから隣のView(左:EditText、その他:水色LinearLayout)までの距離(青矢印)が
layout_marginの指定になります。
<LinearLayout android:layout_height="0dip" android:background="@color/aqua" android:layout_weight="2" android:layout_width="match_parent" android:id="@+id/linearLayout2" android:orientation="horizontal" android:padding="15dip"> <EditText android:id="@+id/editText1" android:layout_height="match_parent" android:layout_weight="1" android:layout_width="0dp" android:gravity="top"> </EditText> <LinearLayout android:layout_height="match_parent" android:gravity="center" android:layout_margin="30dip" android:orientation="vertical" android:background="@color/yellow" android:layout_weight="1" android:layout_width="0dip" android:id="@+id/linearLayout5"> <!-- 中略 --> </LinearLayout> </LinearLayout>
■標準のdividerを使用する
過去記事において、ListViewのdividerをカスタマイズする記事を紹介しました。
こちらも参考にどうぞ。
ExpandableListViewクラスの表示をカスタマイズする
画像イメージを作成するのが面倒である場合、『@android:〜』で始まる要素の指定を行う事により、Androidが標準で持つリソースにアクセスできます。
今回の例では、ImageViewのandroid:srcに@android:drawable/divider_horizontal_darkを指定しています。
また、画像イメージを横いっぱいに広げるため、android:scaleTypeにfitXYを指定しています。
<ImageView android:layout_height="10dip" android:scaleType="fitXY" android:layout_width="match_parent" android:src="@android:drawable/divider_horizontal_dark" android:id="@+id/imageView1"></ImageView>
■weightを使用する
layout_weightを指定することで、比率を調節することができます。
比率として指定する場合には、widthまたはheightを0dipとすると指定しやすくなります。
※weightを指定した際の詳細な計算方法などは、zaki様のブログを参考に。
例えば、サンプルでは
上と下のLinearLayoutの割合を1:2に指定しています。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/black"> <LinearLayout android:layout_height="0dip" android:layout_margin="10dip" android:background="@color/chocolate" android:layout_width="match_parent" android:id="@+id/linearLayout1" android:layout_weight="1" android:gravity="center"> <!-- 中略--> </LinearLayout> <ImageView android:layout_height="10dip" android:scaleType="fitXY" android:layout_width="match_parent" android:src="@android:drawable/divider_horizontal_dark" android:id="@+id/imageView1"></ImageView> <LinearLayout android:layout_height="0dip" android:background="@color/aqua" android:layout_weight="2" android:layout_width="match_parent" android:id="@+id/linearLayout2" android:orientation="horizontal" android:padding="15dip"> <!-- 中略 --> </LinearLayout> </LinearLayout>
最後に、全体のLayoutファイルを引用します。
紹介した要素に着目すれば、LinearLayoutのみでも大抵のLayout構成が作成できることと思います。
また、今回のサンプルではcolorの指定に、プログラミング雑記様のcolor.xmlを利用させて頂いております。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/black"> <LinearLayout android:layout_height="0dip" android:layout_margin="10dip" android:background="@color/chocolate" android:layout_width="match_parent" android:id="@+id/linearLayout1" android:layout_weight="1" android:gravity="center"> <FrameLayout android:layout_height="100dip" android:layout_marginLeft="10dip" android:background="@color/blue" android:layout_weight="1" android:layout_width="0dip" android:id="@+id/frameLayout1"></FrameLayout> <LinearLayout android:layout_height="match_parent" android:gravity="center_vertical" android:background="@color/darkgray" android:layout_weight="2" android:layout_width="0dip" android:layout_margin="10dip" android:id="@+id/linearLayout3" android:orientation="vertical"> <FrameLayout android:layout_height="40dip" android:layout_gravity="center_horizontal" android:background="@color/fuchsia" android:layout_width="40dip" android:layout_marginTop="5dip" android:id="@+id/frameLayout2"></FrameLayout> <FrameLayout android:layout_height="40dip" android:layout_gravity="right" android:background="@color/violet" android:layout_width="40dip" android:layout_marginRight="5dip" android:id="@+id/frameLayout3"></FrameLayout> <FrameLayout android:layout_height="40dip" android:layout_gravity="left" android:background="@color/beige" android:layout_width="40dip" android:layout_marginLeft="5dip" android:layout_marginBottom="5dip" android:id="@+id/frameLayout4"></FrameLayout> </LinearLayout> </LinearLayout> <ImageView android:layout_height="10dip" android:scaleType="fitXY" android:layout_width="match_parent" android:src="@android:drawable/divider_horizontal_dark" android:id="@+id/imageView1"></ImageView> <LinearLayout android:layout_height="0dip" android:background="@color/aqua" android:layout_weight="2" android:layout_width="match_parent" android:id="@+id/linearLayout2" android:orientation="horizontal" android:padding="15dip"> <EditText android:id="@+id/editText1" android:layout_height="match_parent" android:layout_weight="1" android:layout_width="0dp" android:gravity="top"> </EditText> <LinearLayout android:layout_height="match_parent" android:gravity="center" android:layout_margin="30dip" android:orientation="vertical" android:background="@color/yellow" android:layout_weight="1" android:layout_width="0dip" android:id="@+id/linearLayout5"> <TextView android:layout_width="match_parent" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_height="wrap_content" android:text="TextView" android:id="@+id/textView1" android:gravity="left"></TextView> <TextView android:layout_width="match_parent" android:gravity="right" android:textAppearance="?android:attr/textAppearanceMedium" android:layout_height="wrap_content" android:text="TextView" android:id="@+id/textView2"></TextView> <TextView android:layout_width="match_parent" android:gravity="center_horizontal" android:textAppearance="?android:attr/textAppearanceSmall" android:layout_height="wrap_content" android:text="TextView" android:id="@+id/textView3"></TextView> <Button android:text="Button" android:id="@+id/button1" android:gravity="right" android:layout_gravity="center_horizontal" android:layout_marginBottom="5dip" android:layout_width="match_parent" android:layout_height="wrap_content"></Button> </LinearLayout> </LinearLayout> </LinearLayout>