2011年03月28日

ダイアログの表示はshowDialogで!

今まで、適当にダイアログを表示させていたのですがshowDialogで表示させるとメリットが大きいことがわかりました。


ダイアログの表示には2種類あります。


「Activityの管理のもとに表示」 と 「自分で表示」


「Activityの管理のもとに表示」とはonCreateDialogの中でダイアログを作って、showDialogで表示させることです。

「自分で表示」とは、onCreateDialogを使わずに、Dialog.show()で表示させることです。

結論からいうと、Dialog.show()はだめです。メリットなし。
では、Dialog.show()の場合を見てみましょう!

dialogstart.png

クリックすると、ダイアログを表示します。

dialogShow.png

一見できているように見えます。

ここで画面を横向きにしてみます。

dialogYoko.png

・・・・ダイアログが消えました!
そして、エラーはでませんでしたが、DDMSのログにはこんな文字が!


E/WindowManager( 522): Activity jp.r.dialogtest.main has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c41290 that was originally added here
E/WindowManager( 522): android.view.WindowLeaked: Activity jp.r.dialogtest.main has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c41290 that was originally added here
E/WindowManager( 522): at android.view.ViewRoot.(ViewRoot.java:227)
E/WindowManager( 522): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
E/WindowManager( 522): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
E/WindowManager( 522): at android.view.Window$LocalWindowManager.addView(Window.java:424)
E/WindowManager( 522): at android.app.Dialog.show(Dialog.java:239)


さきほどのダイアログがメモリリークしたらしいです・・・・・
Dialog.show()はヤバイです!!


それでは、showDialogをつかった場合をみてみましょう。

dialogShow.png

ここは同じです。

dialogYokoOK.png

横むいてもアクティビティが管理してくれてるので、ばっちり表示されています!




public class main extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

//クリックするとダイアログ表示
Button bt = (Button)findViewById(R.id.button1);
bt.setOnClickListener(mOnClickListener_Show);
}


private final View.OnClickListener mOnClickListener_Show = new View.OnClickListener() {
public void onClick(View v) {

//ダイアログ表示はかならずこれで行う! Activityにある関数
//内部でonCreateDialog -> onPrepareDialog が呼ばれる
showDialog(0);

}};



@Override
protected Dialog onCreateDialog(int id) {
Dialog dialog = super.onCreateDialog(id);

//idは何個かダイアログがある場合に使う
if ( id == 0 )
{
//showDialogを呼ぶときに1度だけ呼ばれる
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
dialogBuilder.setTitle("タイトル");
dialogBuilder.setMessage("メッセージ");

dialogBuilder.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
});
dialog = dialogBuilder.create();
}

return dialog;
}

@Override
protected void onPrepareDialog(int id, Dialog dialog) {
super.onPrepareDialog(id, dialog);

//showDialogを呼ぶとき毎回呼ばれる
//ダイアログの状態を変化させることができる
if ( id == 0 )
{
//今回なんもしない
}
}

}
posted by R at 15:01| Comment(0) | 日記
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: