Dialog 사용을 하다보면 Activity에 멤버로 들고다니는 경우가 있어서
관리하기도 어렵고 해서 onCreateDialog/onPrepareDialog를 사용함.
※ 개인적으로, 관리하기 어렵다는 내용은 빠르게 이벤트 발생 시 Dialog가 중복해서 뜬다거나..
레이아웃이 전부 달라 멤버 필드로 각 Dialog를 갖고 있으면서 show/hide하면서
위의 중복 문제로 show/hide flag를 두거나 isShow() 등으로 확인하는 번거로움 등을 말함
onCreateDialog, onPrepareDialog
1. onCreateDialog 내에서 생성되어 return되는 dialog는 onCreateDialog를 오버라이딩한 액티비티의 소유가 됨.
2. 고정적인 내용(최초 생성 시 1회 호출) vs 유동적인 내용(showDIalog마다 호출) 정도로 요약 가능
3. 호출 흐름
- 최초: showDialog( id ) 호출 → onCreateDialog → onPrepareDialog
- 이후: showDialog( id ) 호출 → onPrepareDialog 만 계속 호출됨
정적인 팝업: onCreateDialog에서만 처리해도 됨 (onPrepareDialog 사용 안해도 무방)
동적인 팝업: onCreateDialog에는 정적 내용만 넣고 onPrepareDialog에 동적 내용을 추가한다.
onCreateDialog( int id ) 및 onPrepareDialog( int id, Dialog, dialog ) 둘은 deprecated 되었다고 합니다.(인자가 하나씩 적음)
http://developer.android.com/reference/android/app/Activity.html#onCreateDialog(int)
http://developer.android.com/reference/android/app/Activity.html#onPrepareDialog(int, android.app.Dialog)
final int DIALOG_ID_NOTICE = 0;
@Override
protected Dialog onCreateDialog(int id, Bundle args)
{
Dialog dialog = null;
switch( id )
{
case DIALOG_ID_NOTICE:
{
dialog = new Dialog( mContext, R.style.Theme_Dialog );
dialog.requestWindowFeature( Window.FEATURE_NO_TITLE );
dialog.setContentView( R.layout.custom_dialog_purchase_house );
TextView title = (TextView) dialog.findViewById( R.id.dialogTitle );
if( title != null )
title.setText("Notice");
Button btnCancel = (Button) dialog.findViewById(R.id.dialogCancel );
if( btnCancel != null )
{
btnCancel.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
dismissDialog( DIALOG_ID_NOTICE );
} catch (Exception e) {
Log( "[onCreateDialog] dialog id does not exist" );
}
}
});
}
}
break;
default:
Log( "[onCreateDialog] dialog id is unknown, dialog will be null." );
break;
}
return dialog;
}
@Override
protected void onPrepareDialog(int id, Dialog dialog, Bundle args)
{
super.onPrepareDialog(id, dialog, args);
switch( id )
{
case DIALOG_ID_NOTICE:
{
TextView content = (TextView) dialog.findViewById( R.id.dialogMessage );
if( content != null )
{
if( mResult == false )
content.setText( "Success!" );
else
content.setText( "Fail!" );
}
}
break;
default:
break;
}
}
Dialog를 보여주고 싶은 곳에서 showDialog( DIALOG_ID_NOTICE );
Dialog를 닫을 곳에서 dismissDialog( DIALOG_ID_NOTICE );
null 처리 이딴거 다 뺴고싶지만 군데군데 들어갔네요.. 습관 들입시다;
(복붙 하고 색만 입힌거라 수정이 귀찮..)
당연한거지만 위에 대응하는 custom dialog xml을 만드실 땐
TextView (@+id/dialogTitle )
TextView (@+id/dialogMessage )
Button (@+id/dialogCancel )
위 세 개 위젯은 반드시 추가해서 만들어주세요~
그리고 Log는 보통 자주들 쓰시는 Log.d( "tag", "msg" ) 를 고친거에요~
이래저래 바꾸는건 상관 없지만 소스 긁어다 하시는 분들은 id 맞춰서..
removeDialog( id ) 같은 경우에 즉시 제거가 되지 않는 경우가 발생할 수 있다고 하네요,
그러니 onCreateDialog 를 강제로 부르려고 removeDialog( id ) 를 사용하고 showDIalog( id )를 호출하면
정말 재수 없으면 무슨 일이 벌어질지 모른다는 글을 본 기억이 있는데 찾기가 귀찮..
결론은 onCreateDialog에서는 되도록 정적인 일만 하게 두시고 onPrepareDialog에서 동적인 일들을 처리하여
onPrepareDialog만 불려도 되도록 해주세요.
위 예에서는 onCreateDialog 에서 첫 세 줄만 남겨두시고 나머진 onPrepareDialog로 옮겨주심 되겠네요.
dialog = new Dialog( mContext, R.style.Theme_Dialog );
dialog.requestWindowFeature( Window.FEATURE_NO_TITLE ); // must request before setContentView
dialog.setContentView( R.layout.custom_dialog_purchase_house );
후.. 은근 길어졌네..
다음에는 Dialog 위치/크기를 자유자재로 바꾸는걸 보도록 할께요..
'Android' 카테고리의 다른 글
Custom dialog 위치/크기 변경하기 (1) | 2012.09.26 |
---|---|
Avoding memory leaks (0) | 2012.09.10 |
안드로이드 성능 개선 (0) | 2012.08.31 |
큰 Bitmap 사용 시 주의점 (0) | 2012.08.31 |
AnimationDrawable 사용 시 주의점 (2) | 2012.08.24 |