2012年11月15日木曜日

【Android】レイアウトを載せたダイアログの幅がwrapしてくれない

Androidのレイアウト.
どれだけ学んでも完璧にはいかないものである.

今日はレイアウトをセットしたAlertDialogの幅が
レイアウトにwrapしてくれないという問題で結構ひっかかっていた.

作ろうとしていたのはインテント送信先アプリ一覧ダイアログ.
iOS6のOpen Inみたいなレイアウトで3x3のグリッドをダイアログに表示させたい.

まず載せるレイアウトがこれ.
dialog_app_list.xml

そしてダイアログを表示させる元のjavaクラスがこれ.
MainActivity.java

本来ならGridViewに対していろいろ処理を行うんだろうけど
そんなことしなくても現象が発生するし
そういうことを書くとコード可読性が下がるから必要なモノだけ.

すると,こういう表示になる.
wrap_contentしているはずのLinearLayoutがAlertDialog全体に引き伸ばされている.
LinearLayoutとGridViewのbackgroundはこのために設定している.
つまり,この緑色部分に3x3のアイコンが並んでいると想像して欲しい.

我々が望んでいるのは画面幅に引き伸ばされたダイアログではなく
GridViewの幅ぴったりなダイアログである.
横幅いっぱいになるならレイアウト諦めて横一列にアイコンを並べられるだけ並べるとか
アイコンとアイコンの間隔がいっぱい開いたダイアログとか
そういったことはしないのである.
ここは見栄えのいい3x3にこだわろう.

ちなみに,LinearLayoutを潰して
dialog_app_list.xmlをGridViewだけのレイアウトにした場合
つまりこう変更すると

layout_widthの値を無視して
GridViewの幅が画面全体に引き伸ばされた.
つまり横幅いっぱいのAlertDialog全体が緑色に成った.
いちいち引き伸ばして…いらんおせっかいである.


どこを調べてもろくな情報がなかった.
悩みまくった結果,問題の本質はAlertDialogにあったらしい.
AlertDialogにsetViewするとレイアウト幅は何を指定しようと
画面幅まで引き伸ばされるようだ.
しかし,setViewしないAlertDialogはそういったことはない.
こういったときは一個上の親にお世話になりにいくべきか.

というわけでAlertDialogを使わずにDialogを使えば解決した.
ダイアログにセットするレイアウトはLinearLayoutを含んだ元のレイアウトに戻している.
ダイアログを表示するMainActivity.javaはこうなった.

するとちゃんとレイアウト幅に合わせたダイアログが表示された
…が!タイトル領域がデフォルトで表示されていて邪魔である.
サブクラスのAlertDialogが表示しないことが可能なのでDialogでも可能なはずである.

このタイトル領域はDialog.setContentViewする前に
Dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
とすれば消えてくれる.
つまり一行加えてMainActivity.javaはこうなって

表示が意図通りのものになって安堵した.

0 件のコメント:

コメントを投稿