Android、Java、Web系、Linux、マラソン等の備忘録

2012/07/24

Android:カスタマイズしたAlertDialog.Builderの幅を変更

0 件のコメント

ダイアログの幅をカスタマイズするなら、Dialogクラスを使った方がダイアログの幅はいじりやすいです。こちらでされてるように、

・Y.A.M の 雑記帳: Android Dialog の大きさを自分で設定する
http://y-anz-m.blogspot.jp/2012/05/androiddialog.html

AlertDialog.Builderをいじるときは、ちょっとハマったのでメモしておきます。

環境

Windows7
JDK1.7
Eclipse 3.7 Indigo Service Release 2
Android 2.1

幅を指定しないと…

AlertDialog.Builderでも、setTitle("hogehoge");のように、タイトルを設定してやれば、特に幅を気にすることもないかもしれません。このように適切な幅で表示してくれます。

image

しかし、setTitle()をしないで、XMLファイルからレイアウトを読み込んだりすると、そのXMLファイルのレイアウト幅で表示されてしまいます。

image

幅を指定する

ググったらこちらにやり方が載ってましたが、

・android - How to make an alert dialog fill 90% of screen size? - Stack Overflow
http://stackoverflow.com/questions/2306503/how-to-make-an-alert-dialog-fill-90-of-screen-size

背景が真っ黒になったりするので、微調整しました。AlertDialog.Builderに対して、もしくはAlertDialog.Builderを継承したクラス内に記述してやれば良いでしょう。R.layout.dialog_layoutはボタンのみが配置されてるXMLファイルです。

    // XMLファイルからレイアウトを読み込む
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.dialog_layout, null);

setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
// OKボタンをクリックした時の処理
dialog.cancel();
}
});
setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
// Cancelボタンをクリックした時の処理
dialog.cancel();
}
});
setView(view);

Dialog d = create();
d.show();
LayoutParams lp = d.getWindow().getAttributes();
lp.width = LayoutParams.FILL_PARENT;
d.getWindow().setAttributes(lp);

こんな感じ



また、画面幅の求め方は、以下のように(Activityでの例)





    WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
Display disp = wm.getDefaultDisplay();
int width = (int)(disp.getWidth() * 0.8);


int widthの値は画面幅80%を求めています。これをさっきのlp.widthに指定してやれば良いです。



ソース



初めてGithubにアップロードしてみました。※変なスペルが混ざってしまいましたが…



AlertDialog.Builderを継承したクラス(CustomAlertDialog)をActivityから呼び出すものです。CustomAlertDialogでは、サイズを指定した場合とそうでない場合の2種類のコンストラクタを用意しています。サイズが指定されなかった場合は、LayoutParams.FILL_PARENTの幅として表示されます。


takaiwa/CustomWidthAlerDialog · GitHub

0 件のコメント :

コメントを投稿