2012年1月30日月曜日

[Android TIPS] AlertDialogのボタンサイズを調整する

ダイアログのボタンサイズを調整したかったんすが、
ずっとやり方が分からなくて。苦手なテーマをいじったり、
自分でレイアウトを作ってみたり、色々やってたんすが、
ダイアログの下部に余白が残ってしまったりと、うまく
表示できなかったんです。

で、やっとやり方がわかったので書いてみました。

下記みたいなコードを書くと...

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(android.R.drawable.ic_dialog_info);
builder.setTitle("こんばんわ");
builder.setMessage("一杯いかが?");
builder.setPositiveButton("ちょうだい", null);
builder.setNeutralButton("うーん", null);
builder.setNegativeButton("いいやまたあとで", null);
Dialog dialog = builder.create();
dialog.show();


こんな感じでボタン幅が均等になって、ボタンラベルが
2行になっちゃいます。うまくシュリンクしてくれれば
1行で収まるのに...

そんな時には、下記のように書くと...

final int WC = LinearLayout.LayoutParams.WRAP_CONTENT;
final int FP = LinearLayout.LayoutParams.FILL_PARENT;
final LinearLayout.LayoutParams layoutParams = 
 new LinearLayout.LayoutParams(WC, FP, 1);

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(android.R.drawable.ic_dialog_info);
builder.setTitle("こんばんわ");
builder.setMessage("一杯いかが?");
builder.setPositiveButton("ちょうだい", null);
builder.setNeutralButton("うーん", null);
builder.setNegativeButton("いいやまたあとで", null);
Dialog dialog = builder.create();

dialog.setOnShowListener(new OnShowListener() {
 public void onShow(DialogInterface dialog) {
  Button btnPositive = ((AlertDialog)dialog).getButton(
   DialogInterface.BUTTON_POSITIVE);
  if (btnPositive != null) {
   btnPositive.setLayoutParams(layoutParams);
   btnPositive.setSingleLine();
  }
  
  Button btnNeutral = ((AlertDialog)dialog).getButton(
   DialogInterface.BUTTON_NEUTRAL);
  if (btnNeutral != null) {
   btnNeutral.setLayoutParams(layoutParams);
   btnNeutral.setSingleLine();
  }
  
  Button btnNegative = ((AlertDialog)dialog).getButton(
   DialogInterface.BUTTON_NEGATIVE);
  if (btnNegative != null) {
   btnNegative.setLayoutParams(layoutParams);
   btnNegative.setSingleLine();
  }
 }
});

dialog.show();


うまく収まってくれます。ポイントは ...

  • getButton() メソッドでボタンの参照がとれるけど、OnShowListener とかの DialogInterface 経由でとらないと null になっちゃいます。
  • setLayoutParams() メソッドで、幅を WRAP_CONTENT に、weight を1に設定します。
  • setSingleLine() メソッドで1行に収まるようにします。

そんなかんじー。

0 件のコメント:

コメントを投稿