うさがにっき

読書感想文とプログラムのこと書いてきます

Activityのテーマにandroid:style/Theme.Dialogを指定したときの注意点

概要

Activityのテーマにandroid:style/Theme.Dialogを指定するとActivityがDialogの様なレイアウト、挙動になるので独自風dialogを作成するのに便利
しかし、レイアウトの作成などに癖があるのでその注意点をめもっておく

問題

<activity 

    android:theme="@android:style/Theme.Dialog" 
    >
</activity>

などとテーマを指定すると、activityがdialogっぽいデザインになる
例えば画面外部をタップすると画面が閉じてくれるようになる

しかし、この画面のサイズを決めているのはどうやら、画面の一番上の子供の要素になる様子
例えばこの一番上の子供の要素をwrap_content,wrap_contentなどにすると表示される画面が小さくなったり、表示されてないように見えたりして困る

<?xml version="1.0" encoding="utf-8"?>
<!-- ここでfill_parentでもダメ -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="10dp"
    android:background="@color/white"
    android:gravity="center"
    android:orientation="vertical" >

    <!-- こっちのサイズをみる -->
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

	<!-- こっちはみない -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:layout_marginBottom="15dp"
        android:layout_marginLeft="6dp"
        android:layout_marginRight="6dp"
        android:layout_marginTop="30dp"
        android:gravity="center"
        android:orientation="horizontal"
        android:weightSum="1" >

	</LinearLayout>
</LinearLayout>

こんなレイアウトにしてしまうとimageViewのサイズを参考に画面を構成し、srcをjavaで設定する場合などでsizeをwrapにするとダイアログがきちんと表示されない。下のレイアウトでサイズ指定とかしていてもダメ。

解決方法

二通りある

  1. 最初の子供のレイアウトのサイズを数字で指定する。
  2. java側で画面サイズを指定してやる。

一つ目の方法は、

<?xml version="1.0" encoding="utf-8"?>
<!-- ここでfill_parentでもダメ -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="10dp"
    android:background="@color/white"
    android:gravity="center"
    android:orientation="vertical" >

    <!-- こっちのサイズをみる -->
    <ImageView
        android:layout_width="50dp"
        android:layout_height="50dp" />

	</LinearLayout>
</LinearLayout>

このように最初の子要素のサイズを数字で指定してやること。

二つ目はjava側で

getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);

と指定してやれば、dialogのサイズが強制的に画面サイズになるので、marginなどでdialogのサイズを調整する。