はうすてんぼぶ

コードかいてて疑問に思ったことや、興味あることをつらつらと暇なときに書く場所、ここはそんな場所

Dialogについて

しばらく考えてたけど分からなかったDialogについて書く
てか,誰か書いてたら書かないんだけど書いて無さそうだからメモ替わりに書いておく


いや,分からなかったってのはダイアログのタイトルの消し方なんだけどね
意外と検索に引っかからない,またはあっても「違う!」ってのが多くて困った


タイトルを消すためには,AlertDialog.Builderを使って,Layoutをぶち込めばおk(下みたいに)

AlertDialog.Builder dia = new AlertDialog.Builder(this);
LayoutInflater inflater = LayoutInflater.from(this);
final View actionAlertView = inflater.inflate(R.layout.dialog_layout, null);
dia.setView(actionAlertView);

AlertDialog aDia = dia.create();
aDia.show();

ってのは少しgoogleで調べれば分かるんですが,これ実は欠点がある
ってか調べててその解決策が見つからなくてすげー困った


この方法,一見するとタイトルがないように見えるんだけど,dialog_layout.xmlのサイズが画面いっぱいになるようにレイアウトを組むと何か変な隙間が目立つ
下の画像はdialog_layout.xmlのheightを1000dp(画面サイズを大きく上回る値)に設定して実行した場合の画面


f:id:Silent-Bob:20100824221930p:image


で,setTitleして,タイトルを設定して実行した場合の画面が下の画像のようになる


f:id:Silent-Bob:20100824221931p:image


つまり,別にタイトルが見えなくなっているだけで,決してそのスペースが消滅しているわけではないってのがスクショから分かると思うの

普通にDialogにsetTitleしなくても同じ現象みたいになるけど,あの無駄なスペースがただ透過されているだけみたいな現象になってるんだよね


ちょっと使ったことある人なら分かると思うけど,タイトルを設定せずにAlertDialogを使うとやや画面中央下に配置される経験があるはず

その原因はタイトルのこの空白スペースもレイアウトの高さに加わっているためだと,勝手に推測しとく(原因よくわかんないし)


で,結局下のようにすると治ります.
ようはタイトル部分にレイアウトを置いちまえば良いんじゃないの!?って感じ
これで良いのかどうかは知らんけど,まぁ全画面に表示されてるからおっけー

AlertDialog.Builder dia = new AlertDialog.Builder(this);
LayoutInflater inflater = LayoutInflater.from(this);
final View actionAlertView = inflater.inflate(R.layout.dialog_layout, null);
//dia.setView(actionAlertView);
dia.setCustomTitle(actionAlertView);

AlertDialog aDia = dia.create();
aDia.show();

上のように変えて実行した結果が下の画像みたいになる
ちゃんと全画面に表示されてて良いね!


f:id:Silent-Bob:20100824221932p:image


結構このテクニックは他のアプリで見かけたけど全然方法がわからなくてグギギってなってたけどやっと解決した
よかったよかった


んじゃおうちに帰ろう



11月8日追記
このテクニックは便利ですが,セットするViewの中にEditTextとかあるとそこ押してもキーボードがでてこない感じがするので,そういったときは普通にsetViewしないといけないかもしれません
なのでもし強制的にキーボードを表示する方法があったら教えて下さいorz


あと誰かDialogにWebView入れた時にキーボードでない問題解決した人いたら教えて下さいor2