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行に収まるようにします。

そんなかんじー。

2012年1月9日月曜日

[Android TIPS] デバッグに有用な情報を取得する

前回の更新から1ヶ月半あけてしまった... まだ2回目なのに...
というようなことは最初から予想できたので気を取り直して... ;-)

今回は開発者がデバッグする際に有用になる情報を取得する方法です。

青空読手では下記の場合にデバッグ情報を GAE 経由で自分の Gmail にメールを投げています。

  • UncaughtExceptionHandler で補足したエラーが前回起動時にあった場合
  • 設定画面からコメント機能を通じてメッセージが送られた場合

収集しているデバッグ情報は下記のとおりです。

  • 端末情報
    • ブランド
    • 製造元
    • モデル
  • OS 情報
    • バージョン
    • SDK
    • ロケール
  • アプリ情報
    • バージョン
    • SharedPreferences の設定値

これらは下記のようなメソッドにより収集可能です。

public static String getDeviceInfo(Activity activity)
{
 String brand = Build.BRAND;
 String manufacturer = Build.MANUFACTURER;
 String model = Build.MODEL;
 
 DisplayMetrics metrics = new DisplayMetrics();
 activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
 int w = metrics.widthPixels;
 int h = metrics.heightPixels;
 
 return String.format("%s - %s - %s (%dx%d)", brand, manufacturer, model, w, h);
}

public static String getOsInfo()
{
 String relese = Build.VERSION.RELEASE;
 String sdk = Build.VERSION.SDK;
 Locale locale = Locale.getDefault();
 
 return String.format("%s (api: %s) %s", relese, sdk, locale);
}

public static String getVersion(Context context)
{
 try
 {
  PackageManager manager = context.getPackageManager();
  PackageInfo packInfo = manager.getPackageInfo(context.getPackageName(), 0);
  return packInfo.versionName;
 }
 catch (Exception e)
 {
  e.printStackTrace();
 }
 return "1.0.0";
}

とれる情報はこんな感じです。

  • KDDI - HTC - PC36100 (480x800), 2.3.4 (api: 10) ja_JP
  • KDDI - HTC - ISW12HT (540x960), 2.3.4 (api: 10) ja_JP
  • KDDI - KYOCERA - ISW11K (480x800), 2.3.5 (api: 10) ja_JP
  • KDDI - FUJITSU TOSHIBA MOBILE COMMUNICATIONS LIMITED - IS04 (480x854), 2.2.2 (api: 8) ja_JP
  • KDDI - FUJITSU TOSHIBA MOBILE COMMUNICATIONS LIMITED - ISW11F (720x1280), 2.3.5 (api: 10) ja_JP
  • KDDI - PANTECH - IS06 (480x800), 2.2.1 (api: 8) ja_JP
  • KDDI - SHARP - IS11SH (540x960), 2.3.3 (api: 10) ja_JP
  • samsung - samsung - SC-02C (480x800), 2.3.3 (api: 10) ja_JP
  • docomo - Sony Ericsson - SO-01C (480x854), 2.3.2 (api: 9) ja_JP
  • docomo - Sony Ericsson - SO-01D (480x854), 2.3.4 (api: 10) ja_JP
  • docomo - Sony Ericsson - SO-03C (480x854), 2.3.4 (api: 10) ja_JP
  • DOCOMO - FUJITSU - F-01D (1280x752), 3.2 (api: 13) ja_JP
  • dell - Dell Inc - 001DL (480x800), 2.2.2 (api: 8) ja_JP
  • softbank_jp - HTC - 001HT (480x800), 2.3.3 (api: 10) ja_JP
  • SBM - SHARP - SBM003SH (800x480), 2.2.1 (api: 8) ja_JP
  • LGE - LGE - L-04C (320x480), 2.2.2 (api: 8) ja_JP
  • acer - Acer - E140 (240x320), 2.2 (api: 8) ja_JP
  • Huawei - HUAWEI - Ideos (240x320), 2.2.1 (api: 8) ja_JP
  • ZiiLABS - Creative Technology Ltd - ZiiO7 (800x480), 2.2.1 (api: 8) ja
  • emxx - renesas - Full Android (800x480), 2.2.1 (api: 8) ja_JP

上記メソッドではアプリのバージョンは AndroidManifest.xml の android:versionName 属性の値がとれてきます。

そんなかんじー。