티스토리 뷰



이 자료들은 팁스소프트에서 제공하는 [ 알짜배기 ] 프로그램을 이용하면 더 편리하게 볼수 있습니다.
* 알짜배기 프로그램 받기 - http://www.tipssoft.com/bulletin/tb.php/QnA/8406
* 안드로이드 강좌 목록 - http://www.tipssoft.com/bulletin/tb.php/old_bbs/501
지난 강좌에서는 간단하게 일회성으로 사용할 수 있는 AlertDialog 를 사용하는 방법에 대하여 알아
봤습니다. 해당 방법으로 대화상자를 사용하면 대화상자가 보여져야할 때 생성되고, 대화상자가
닫힐 때 대화상자에 대한 해당 리소스까지 모두 제거되는데 이러한 방식으로 대화상자를 자주 사용하게
되면 대화상자가 실행될 때마다 생성, 제거가 반복되면서 비효율적으로 동작하게 될 것입니다.
이러한 문제는 대화상자를 재사용 가능하도록 하여 어느정도 해소할 수 있습니다. 대화상자가
처음 실행될 때 단 한번만 생성하고, 대화 상자를 닫을 때에는 해당 리소스까지 제거하지 않고, 보이지
않도록만 해주는 것입니다. 이 후 다시 대화상자가 실행되어야 할 때 액티비티가 관리하고 있는
대화상자 중에서 해당 대화상자가 존재하는지 여부를 확인하고, 이미 생성된 경우에는 출력만 다시
해주도록 하는 것입니다.
이번 강좌에서는 대화상자를 재사용 가능한 방법으로 이용하는 방법에 대하여 알아보도록 하겠습니다.
1. 대화상자 생성하기
대화상자를 재사용 가능하도록 관리하려면 Activity 클래스의 onCreateDialog 메소드를 재정의해야
합니다. 이 메소드는 생성되지 않은 대화상자를 띄우고자 할 때 해당 대화상자를 생성하기 위해서
시스템에 의해서 자동으로 호출되는 메소드입니다. 액티비티에서 여러개의 대화상자를 사용할 수도
있기때문에 각 대화상자를 정수형 ID 로 분리하여 여러 개의 생성 코드를 구성할 수 있습니다.
alertDialog 대화상자에서 사용할 수 있는 버튼의 수는 3개이며 DialogInterface.OnClickListener 를
생성하여 onClick 메소드를 재정의하면 각 버튼이 클릭되었을 때 어떤 일을 처리할 것인지 정의할
수 있습니다. 아래의 코드는 대화상자를 생성하고 대화상자의 버튼에 리스너를 등록하는 예문입니다.
protected Dialog onCreateDialog(int id)
{
Dialog dialog = null;
String str = "";
switch(id) {
// ID_2BUTTON_DIALOG 로 정의된 0 번 ID 로 대화상자를 생성해야하는 경우
case ID_2BUTTON_DIALOG : {
// AlertDialog 를 생성해주는 AlertDialog.Builder 객체를 생성한다.
AlertDialog.Builder builder = new AlertDialog.Builder(this);
// 대화상자의 제목을 설정한다.
builder.setTitle("Who are you?");
// 대화상자에 출력될 메세지 내용을 적는다.
builder.setMessage("I am a 2 Button Dialog!!!!!!!!!!!!!!!!");
// 대화상자가 Back 버튼으로 닫히지 않도록 설정한다.
builder.setCancelable(false);

// 좌측(Positive Button) 에 출력될 버튼을 설정한다.
// 해당 버튼을 클릭했을 때 처리할 문장을 리스너로 구성해준다.
builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// Activity 에서 대화상자를 닫도록 메소드를 호출한다.
ExamDialogActivity.this.dismissDialog(ID_2BUTTON_DIALOG);
}
});
// 우측(Negative Button) 에 출력될 버튼을 설정한다.
// 해당 버튼을 클릭했을 때 처리할 문장을 리스너로 구성해준다.
builder.setNegativeButton("NO", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// 대화상자를 취소하여 닫는다.
dialog.cancel();
}
});

// 위에서 설정한 값을 이용하여 대화상자를 생성한다.
dialog = builder.create();
// 대화상자 생성시 토스트에 출력할 문장을 구성한다.
str = "Create 2 Button!!";
break;
}
// ID_3BUTTON_DIALOG 로 정의된 1 번 ID 로 대화상자를 생성해야하는 경우
case ID_3BUTTON_DIALOG : {
// ... 생략 ...
break;
}
default :
dialog = null;
}
// 대화상자가 생성되었다면 토스트를 출력한다.
if(dialog != null) Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
return dialog;
}
위의 코드처럼 onCreateDialog 메소드를 재정의하여 대화상자를 생성한 경우에는 대화상자가 수행을
완료하여 종료되더라도 AlertDialog 객체는 제거되지 않고, 액티비티에 의해 관리됩니다. 그래서
다음에 해당 대화상자를 수행시키면 액티비티는 자신이 관리중인 대화상자중에서 해당 대화상자가
존재하는지 체크한 후에 대화상자가 있으면 해당 객체를 다시 사용하고, 없으면 onCreateDialog
메소드를 이용해서 생성하도록 하는 것입니다.
2. 액티비티에서 대화상자 제어하기
1 번 항목에서 설명한 onCreateDialog 메소드를 재정의하면 재사용 가능한 대화상자를 이용할 수
있습니다. 이것은 액티비티에서 생성된 대화상자를 관리하여 가능한 일이며 액티비티가 처리하는
작업은 대화상자를 생성하는 것 외에도 자신이 관리하고 있는 대화상자를 띄우는 것과, 대화상자를
종료시키는 것 그리고 관리중인 대화상자를 제거하는 것이 있습니다.
2.1 대화상자 띄우기
대화상자를 띄우기위해서는 showDialog 메소드를 사용합니다. 이 메소드를 호출하면 액티비티가
관리하는 대화상자중에서 showDialog 메소드를 호출할 때 명시한 ID 값을 가진 대화상자가 있는지
확인하고, 대화상자가 없는 경우에는 onCreateDialog 메소드를 호출하여 생성한 후 출력시키고,
있는 경우에는 바로 대화상자를 출력시키도록 되어 있습니다. 예를 들면 아래와 같이 코드를
구성할 수 있습니다.
// ID_2BUTTON_DIALOG 로 정의된 0번 ID 의 대화상자를 띄운다.
// 처음 수행하는 경우에는 onCreateDialog 메소드에 정의된대로 대화상자를 생성한 후에
// 띄우게되고, 이미 실행된적이 있는 경우에는 이전에 생성했던 대화상자를 바로 띄운다.
showDialog(ID_2BUTTON_DIALOG);
2.2 대화상자 종료하기
일반적으로 대화상자를 종료할 때에는 대화상자의 확인 버튼이나 취소 버튼을 누르거나 혹은
기기의 Back 키를 누르지만 대화상자가 띄워지고 몇초 후에 닫아야한다거나 액티비티가 특정
조건이 됐을 때 닫아야하는 경우에는 대화상자가 아닌 액티비티에서 임의로 종료시켜야 합니다.
이런 경우에는 dimissDialog 메소드에 종료하고자 하는 대화상자의 ID 를 명시하여 호출해주면
됩니다. 이 메소드를 이용하여 대화상자가 종료하더라도 해당 객체가 제거되는 것은 아닙니다.
// ID_2BUTTON_DIALOG 로 정의된 0번 ID 의 대화상자를 종료한다.
dismissDialog(ID_2BUTTON_DIALOG);
2.3 대화상자 제거하기
대화상자를 사용하는 일이 드물거나 더이상 사용하지 않는 경우에는 시스템의 자원 확보를 위해서
대화상자 객체를 제거하는 것이 좋습니다. 해당 대화상자를 완전하게 제거하려면 제거하고자 하는
대화상자의 ID 를 매개 변수에 명시하여 removeDialog 메소드를 호출하면 됩니다.
// ID_2BUTTON_DIALOG 로 정의된 0번 ID 의 대화상자를 제거한다.
removeDialog(ID_2BUTTON_DIALOG);
3. 실행 화면
위에서 설명한 내용을 바탕으로 대화상자를 띄우는 예제를 구성하였습니다.
액티비티에는 2개의 버튼이 사용되는 대화상자와 3개의 버튼이 사용되는 대화상자를 띄울 수 있는
버튼이 존재하고, 두개의 대화상자 객체를 제거할 수 있도록 구성된 하나의 버튼이 존재합니다.
처음 상단의 두 버튼을 터치하면 하단의 그림처럼 대화상자가 띄워지면서 버튼이 생성되었다는
토스트가 출력됩니다. 대화상자를 종료하고 다시 띄우면 토스트는 더이상 출력되지 않는 것을 볼 수
있습니다.
그러나 "Remove Dialog!!" 버튼을 클릭한 후 상단의 버튼을 클릭하면 생성됐던 대화상자 객체가
제거된 후 대화상자가 호출되는 것이므로 다시 대화상자가 생성되었다는 토스트가 출력됩니다.
※ 현재 이 방법을 널리 사용하고 있지만 안드로이드 3.0 부터는 DialogFragment 클래스를
이용하여 다이얼로그를 사용하도록 권장하고 있습니다. 현재 우리가 사용하고 있는 2.2
혹은 2.3 버전에서는 기본적으로 해당 클래스를 사용하지 않기때문에 안드로이드 3.0 이
많이 사용되면 그때 DialogFragment 를 이용한 대화상자를 사용하는 방법에 대하여
다루도록 하겠습니다.
하겠습니다.


댓글