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
Posted by 독뽀
,