티스토리 뷰



이 자료들은 팁스소프트에서 제공하는 [ 알짜배기 ] 프로그램을 이용하면 더 편리하게 볼수 있습니다.
* 알짜배기 프로그램 받기 - http://www.tipssoft.com/bulletin/tb.php/QnA/8406
* 관리자의 Tipssoft 이야기를 들어보세요 ( 트위터 ID : tipssoft )
* 안드로이드 강좌 목록 - http://www.tipssoft.com/bulletin/tb.php/old_bbs/501
이전 강좌에서는 액티비티에서 대화상자를 생성하고 관리, 제어하는 방법에 대하여 알아보았습니다.
그러나 해당 방법은 대화상자가 처음 생성될 때 생성 여부를 판단하여 한번만 호출되는 onCreateDialog
메소드를 사용하기때문에 이미 대화상자가 만들어져 있다면 해당 대화상자의 내용을 변경하는데는
한계가 있습니다.
따라서 대화상자가 이미 한번 실행되었다가 약간의 정보를 수정하여 다시 보여져야하는 경우
onCreateDialog 메소드가 다시 호출되지 않아서 이전에 생성한 형식대로 대화상자가 그대로 출력되는
문제가 있습니다. 이런 경우에는 대화상자가 출력되기 전에 항상 호출되는 Activity 클래스의
onPrepareDialog 메소드를 재정의하여 대화상자를 재구성할 수 있습니다. 예를 들어 대화상자를 호출할
때마다 대화상자의 호출 횟수를 출력하고자 한다면 onPrepareDialog 에서 넘어오는 Dialog 객체를
이용해서 변경할 수 있습니다.
또한 대화상자를 사용할 때 자원을 많이 필요로하는 작업을 수행하는 경우 해당 리소스가 액티비티에
부담으로 작용할 수 있기때문에 별도의 리스너를 이용하여 대화상자가 종료될 때 특정 메소드에서
정리 작업을 정의할 수 있습니다.
이제부터 대화상자의 출력 전에 작업을 정의하는 방법과 출력 후의 작업을 정의하는 방법에 대하여
알아보도록 하겠습니다.
1. 대화상자 출력 전 준비 작업하기
대화상자가 출력되기 전에 준비 작업을 하기위해서는 Activity 클래스의 onPrepareDialog 메소드를
재정의해야 합니다. onPrepareDialog 메소드의 매개 변수에는 대화상자의 ID 와 객체가 넘어오기
때문에 ID 를 이용해서 변경할 대화상자를 선택하여 변경사항을 적용시켜야합니다.
간단하게 대화상자의 출력 횟수를 대화상자 내용으로 가지는 것을 정의할 때에는 아래와 같이 코드를
구성할 수 있습니다.
// 대화상자가 출력되기 전에 호출되는 메소드
protected void onPrepareDialog(int id, Dialog dialog)
{
// ID_2BUTTON_DIALOG 로 정의된 0 번 ID 의 대화상자인 경우
if(id == ID_2BUTTON_DIALOG) {
// 대화상자 출력 횟수를 증가시킨다.
m_dlg_show_count++;

String str;
str = "Dialog Show Count : " + m_dlg_show_count;

// 새로운 문장을 구성하여 대화상자의 내용에 설정한다.
// Dialog 클래스에는 setMessage 메소드가 없으므로 AlertDialog 클래스로 캐스팅해야 한다.
((AlertDialog)dialog).setMessage(str);
// 대화상자가 출력되기 전 상태임을 토스트로 출력하여 알린다.
Toast.makeText(this, "[onPrepareDialog] Called", Toast.LENGTH_SHORT).show();
}
}
이 메소드는 onCreateDialog 메소드가 호출된 후와 대화상자가 출력되기 전 사이에 호출되며
이미 생성된 대화상자가 액티비티에 존재하면 이 메소드만 대화상자 출력 전에 호출됩니다.
2. 대화상자 출력 후 마무리 작업하기
대화상자를 띄웠다가 대화상자 내의 버튼을 누르거나 안드로이드 기기의 Back 버튼을 누르면
대화상자가 동일하게 종료되는 것처럼 보이지만 "취소" 의 의미로 종료된 것은 별도로 판단하여
처리할 수 있습니다. 또한 대화상자가 종료되는 모든 상황에서 원하는 작업을 수행할 수 있도록
정의할 수도 있습니다.
2.1 무조건 처리되는 onDismiss 메소드
대화상자가 종료되면 종료된 상황이나 조건에 관계없이 특정 리스너를 등록하여 해당 리스너의
메소드가 호출되도록 할 수 있습니다. 이 때 DialogInterface.OnDismissListener 인터페이스를
사용하며 onDismiss 메소드를 재정의하여 처리할 작업을 정의합니다.
onDismiss 메소드가 호출되기 위해서는 해당 리스너가 대화상자에 등록되어 있어야하하는데
DialogInterface.OnDismissListener 를 등록하는 메소드는 AlertDialog.Builder 클래스에 존재하지
않으므로 AlertDialog 클래스의 setOnDismissListener 메소드를 사용하여야합니다.
아래의 코드는 onDismiss 메소드를 재정의하는 간단한 예입니다.
// 대화상자가 종료될 때 처리할 문장을 리스너로 구성하여 대화상자에 설정한다.
dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
public void onDismiss(DialogInterface dialog) {

// ... 생략 ...
// 대화상자가 종료됐을 때 처리할 작업을 명시한다.

}
});
2.2 취소시 처리되는 onCancel 메소드
대화상자를 종료할 때 기기의 Back 키를 누른다거나 cancel 메소드를 호출하여 취소의 의미를
가질 때에는 onDismiss 메소드와 별개로 DialogInterface.OnCancelListener 인터페이스의
onCancel 메소드가 먼저 호출됩니다. 개발자는 onCancel 메소드를 재정의하여 대화상자를
취소하여 종료했을 때 처리하고자 하는 작업을 정의해 둘 수 있습니다.
onCancel 메소드를 사용할 수 있도록 DialogInterface.OnCancelListener 인터페이스를 설정하는
setOnCancelListener 메소드는 AlertDialog.Builder 클래스와 AlertDialog 클래스에 모두 존재하며
어떤 객체로든 한번만 등록하면 됩니다.
아래의 코드는 onCancel 메소드를 재정의하는 간단한 예입니다.
// 대화상자가 취소될 때 처리할 문장을 리스너로 구성하여 대화상자에 설정한다.
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
public void onCancel (DialogInterface dialog) {

// ... 생략 ...
// 대화상자가 취소됐을 때 처리할 작업을 명시한다.

}
});
3. 대화상자의 처리 과정
대화상자는 알림의 목적으로 간단하게 사용하는 것이지만 대화상자를 생성하고 출력하고 종료하는
과정은 그렇게 간단하지만은 않습니다. 이전 강좌와 이 강좌에서 여러가지 메소드를 재정의하여
사용하는 방법을 설명하면서 조금씩 설명했었던 부분을 아래의 그림으로 설명하도록 하겠습니다.
위의 그림은 일반적인 대화상자 처리 과정입니다. 대화상자가 한번 실행되면 해당 대화상자 객체는
액티비티에 의해 관리되기 때문에 두번째 세번째의 실행에서는 onCreateDialog 메소드가 호출되지
않으며 대화상자가 출력되기 직전에는 항상 onPrepareDialog 가 호출됩니다.
대화상자가 종료될 때에는 "취소" 의지가 있었는지에 따라서 DialogInterface.OnCancelListener 의
onCancel 메소드가 호출됩니다. 또한 onCancel 메소드가 호출이 되든 안되든 종료시에는 항상
DialogInterface.OnDismissListener 의 onDismiss 메소드가 호출됩니다.
onCancel 과 onDismiss 메소드처럼 리스너에서 재정의한 메소드들은 반드시 대화상자에 해당
리스너를 등록해주어야 시스템에 의해 호출이 가능해집니다.
4. 실행 화면
위에서 설명한 내용을 바탕으로 대화상자의 출력 내용을 변경하고 대화상자의 처리과정을 토스트로
출력하는 예제를 구성하였습니다.
액티비티에는 대화상자를 실행시키는 버튼과 액티비티가 관리중인 대화상자 객체를 제거하는 버튼이
있습니다. 상단의 버튼을 클릭하면 대화상자가 출력되는데 onPrepareDialog 에 대화상자의 출력문장을
재설정했기때문에 onCreateDialog 메소드에서 구성한 문장은 출력되지 않습니다.
또한 대화상자가 실행되면서 호출되는 메소드들이 토스트에 출력되며 대화상자의 어떤 버튼을 눌러서
대화상자를 종료했는가에 따라서 다른 처리 과정이 토스트에 출력됩니다. 이 부분은 3번 항목에서
다룬 내용을 예제에 추가시킨 것입니다.


댓글