티스토리 뷰



이 자료들은 팁스소프트에서 제공하는 [ 알짜배기 ] 프로그램을 이용하면 더 편리하게 볼수 있습니다.
* 알짜배기 프로그램 받기 - http://www.tipssoft.com/bulletin/tb.php/QnA/8406
* 관리자의 Tipssoft 이야기를 들어보세요 ( 트위터 ID : tipssoft )
* 안드로이드 강좌 목록 - http://www.tipssoft.com/bulletin/tb.php/old_bbs/501
기본적으로 AlertDialog 클래스를 사용하여 대화상자를 구현하면 최대 3 개의 버튼을 사용할 수 있습니다.
그렇기 때문에 버튼을 이용해서 사용자의 의사표현을 입력받으면 세가지 중에 하나만 선택하도록 구성
해야합니다.
하지만 사용자로부터 더 많은 항목중에 하나를 선택하도록 구성하고 싶거나 여러개의 항목 중에서
여러개의 항목을 선택하도록 구성하고 싶을 때에는 세개의 버튼만으로는 해당 기능을 구현할 수 없기
때문에 대화상자에 다른 컨트롤을 사용할 수 있도록 구성하여 기능을 확장시켜야 합니다.
추가적인 컨트롤들은 기본 대화상자에서 문자열을 출력했던 영역에 문자열 대신 리스트나 라디오버튼
또는 체크박스를 배치하는 것이기때문에 대화 상자에 문자열을 출력하도록 설정하면 안됩니다. 만약
빌더 객체의 setMessage 메소드를 이용하여 문자열도 설정하고, 다른 컨트롤도 사용하겠다고 설정하면
어떤 것도 적용하지 않은 대화상자가 출력될 것입니다.
이번 강좌에서는 많은 항목들 중에서 하나를 선택하는 방법으로 대화상자에 리스트를 사용하는 것과
라디오버튼을 사용하는 방법에 대해서 알아보고, 많은 항목을 다중으로 선택할 수 있는 체크박스를
사용하는 방법에 대해서도 알아보겠습니다.
1. 대화상자에 리스트 사용하기
AlertDialog 클래스를 사용하여 대화상자를 생성할 때 대화상자에서 단순한 문자열을 출력하지
않고, 선택 가능한 리스트를 배치하여 사용할 수 있습니다. 버튼을 이용하여 사용자의 의사표현을
입력받는 것은 한계가 있기때문에 리스트를 이용하여 많은 항목중에 하나를 선택하도록 유도하는
것입니다.
기본적으로 제목과 아이콘 그리고 리스트를 설정한 상태의 대화상자는 아래의 그림과 같으며, 항목을
선택하면 대화상자가 자동으로 종료됩니다.
리스트를 설정할때에는 Alert.Builder 클래스의 setItems 메소드를 사용하는데 해당 메소드의 원형은
다음과 같습니다.
public AlertDialog.Builder setItems (CharSequence[] items, DialogInterface.OnClickListener listener)
public AlertDialog.Builder setItems(int itemsId, DialogInterface.OnClickListener listener)
items 에는 리스트의 각 항목으로 구성될 문자열 배열로을 명시하고, listener 에는 항목이 선택될 때
어떻게 처리할지 정의된 리스너 객체를 명시합니다. DialogInterface.OnClickListener 는 대화상자의
버튼을 설정할 때 사용했던 리스너와 동일한 인터페이스이므로 onClick 메소드만 제대로 구성해주면
됩니다.
아래의 코드는 리스트를 적용한 대화상자를 생성하는 예문이며 리스트를 구성할 때 필요한 문자열
배열은 m_singer 멤버 변수로 선언하였습니다.
// 각종 컨트롤의 항목을 구성할 때 사용되는 문자열 멤버 변수 배열
String[] m_singer = {"Tiara", "BigBang", "GG", "2PM", "SISTAR"};
// 대화상자를 생성하는 콜백 메소드
protected Dialog onCreateDialog(int id)
{
Dialog dialog = null;
switch(id) {
// 리스트를 적용한 대화상자
case ID_LIST_DIALOG : {
// AlertDialog 를 생성해주는 AlertDialog.Builder 객체를 생성한다.
AlertDialog.Builder builder = new AlertDialog.Builder(this);

// 대화상자의 제목을 설정한다.
builder.setTitle("Who is Your Favorite Singer?");
// 대화상자의 아이콘을 설정한다.
builder.setIcon(R.drawable.icon);

// 대화상자에서 사용할 리스트의 항목을 설정한다.
// 첫번째 매개변수는 리스트 항목을 문자열로 구성한 배열이며,
// 두번째는 리스트를 클릭했을 때 발생하는 이벤트를 처리하는 리스너를 설정한 것이다.
builder.setItems(m_singer, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
// 선택한 항목의 index 를 이용하여 텍스트뷰에 문자열을 출력한다.
m_display_view.setText(m_singer[item]);
}
});
// 버튼을 설정한다.
// 해당 버튼을 클릭했을 때 처리할 문장을 리스너로 구성해준다.
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// 대화상자를 취소하여 닫는다.
dialog.cancel();
}
});

// 위에서 설정한 값을 이용하여 대화상자를 생성한다.
dialog = builder.create();
break;
}
// ... 생략 ...
}
}
2. 대화상자에 라디오 버튼 사용하기
라디오 버튼이 적용된 대화상자는 리스트를 적용하는 것처럼 다중 항목 중에서 하나를 선택하는
목적으로 사용합니다. 단, 리스트를 적용한 대화상자의 경우에는 기본적으로 항목을 선택함과 동시에
대화상자가 종료되지만 라디오 버튼을 사용하는 대화상자의 경우에는 항목을 선택해도 대화상자가
종료되지 않기때문에 아래의 그림에서 사용중인 "O~K!" 버튼처럼 별도의 확인용 컨트롤을 추가하거나
선택시 대화상자가 바로 종료되도록 리스너를 정의해야 합니다.
라디오 버튼을 설정할 때에는 AlertDialog.Builder 클래스의 setSingleChoiceItems 메소드를 사용하며
해당 메소드는 다음과 같이 오버로딩되어 있습니다.
public AlertDialog.Builder setSingleChoiceItems(CharSequence[] items, int checkedItem,
DialogInterface.OnClickListener listener)
public AlertDialog.Builder setSingleChoiceItems(ListAdapter adapter, int checkedItem,
DialogInterface.OnClickListener listener)
public AlertDialog.Builder setSingleChoiceItems(int itemsId, int checkedItem,
DialogInterface.OnClickListener listener)
public AlertDialog.Builder setSingleChoiceItems(Cursor cursor, int checkedItem, String
labelColumn, DialogInterface.OnClickListener listener)
첫번째 메소드를 살펴보면 items 와 listener 매개 변수가 setItems 메소드에서 사용하는 것과 동일한
것을 알 수 있습니다. checkedItem 매개 변수는 대화상자가 처음 실행되었을 때 초기에 선택되어질
라디오 버튼의 인덱스입니다.
아래의 코드는 라디오 버튼을 적용한 대화상자를 생성하는 예문이며 라디오 버튼을 구성할 때 필요한
문자열 배열은 m_singer 멤버 변수로 선언하였고, 선택된 라디오 버튼의 인덱스를 저장하기 위해서
m_select_index 멤버 변수를 사용합니다.
// 각종 컨트롤의 항목을 구성할 때 사용되는 문자열 멤버 변수 배열
String[] m_singer = {"Tiara", "BigBang", "GG", "2PM", "SISTAR"};
int m_select_index = 0;
// 대화상자를 생성하는 콜백 메소드
protected Dialog onCreateDialog(int id)
{
Dialog dialog = null;
switch(id) {
case ID_RADIO_DIALOG : {
// AlertDialog 를 생성해주는 AlertDialog.Builder 객체를 생성한다.
AlertDialog.Builder builder = new AlertDialog.Builder(this);

// 대화상자의 제목을 설정한다.
builder.setTitle("Who is Your Favorite Singer?");
// 대화상자의 아이콘을 설정한다.
builder.setIcon(R.drawable.icon);

// 대화상자에서 사용할 라디오버튼의 항목을 설정한다.
// 첫번째 매개변수는 여러개의 라디오버튼 항목을 문자열로 구성한 배열이고,
// 두번째는 대화상자가 실행됐을 때 초기에 선택되어지는 항목의 index 이며,
// 세번째는 라디오버튼을 클릭했을 때 발생하는 이벤트를 처리하는 리스너를 설정한 것이다.
builder.setSingleChoiceItems(m_singer, m_select_index, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
// 여러개의 라디오 버튼들 중에서 선택된 인덱스를 저장한다.
m_select_index = item;
}
});
// 좌측(Positive Button) 에 출력될 버튼을 설정한다.
// 해당 버튼을 클릭했을 때 처리할 문장을 리스너로 구성해준다.
builder.setPositiveButton("O~K!", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// 선택했던 라디오버튼의 문자열을 텍스트뷰에 출력한다.
m_display_view.setText(m_singer[m_select_index]);
}
});

// 우측(Negative Button) 에 출력될 버튼을 설정한다.
// 해당 버튼을 클릭했을 때 처리할 문장을 리스너로 구성해준다.
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// 대화상자를 취소하여 닫는다.
dialog.cancel();
}
});

// 위에서 설정한 값을 이용하여 대화상자를 생성한다.
dialog = builder.create();
break;
}
// ... 생략 ...
}
}
3. 대화상자에 체크 박스 사용하기
체크 박스가 적용된 대화상자는 위의 두가지 경우와 달리 여러개의 항목들 중에서 0 개 혹은 다수개를
선택을 하기 위해서 사용합니다. 기본적으로 체크 박스를 사용하는 대화상자는 선택하는 항목의 수가
제한이 없기때문에 항목 선택이 모두 끝나면 아래의 그림에서 "확인" 버튼처럼 확인 의사를 표시할 수
있는 별도의 컨트롤이 필요합니다.
체크 박스를 설정할 때에는 AlertDialog.Builder 클래스의 setMultiChoiceItems 메소드를 사용하며
해당 메소드는 다음과 같이 오버로딩되어 있습니다.
public AlertDialog.Builder setMultiChoiceItems(CharSequence[] items, boolean[] checkedItems,
DialogInterface.OnMultiChoiceClickListener listener)
public AlertDialog.Builder setMultiChoiceItems(Cursor cursor, String isCheckedColumn, String labelColumn,
DialogInterface.OnMultiChoiceClickListener listener)
public AlertDialog.Builder setMultiChoiceItems(int itemsId, boolean[] checkedItems,
DialogInterface.OnMultiChoiceClickListener listener)
첫번째 메소드에서 items 에는 체크 박스의 각 항목을 구성할 문자열 배열을 명시하고, checkedItem
에는 대화상자가 처음 실행되었을 때 각 체크 박스가 체크되어 있을 것인지 여부를 설정하는 boolean
형의 배열을 명시합니다. 그리고 listener 에는 체크박스가 체크되거나 해제될 때 어떻게 처리해 줄
것인지 정의한 리스너 객체를 명시합니다. 이 DialogInterface.OnMultiChoiceClickListener 는
onClick 메소드를 가지는 인터페이스인데 이 리스너를 구현하여 설정하면 체크 박스를 선택할 때마다
onClick 메소드가 호출됩니다.
다음은 체크 박스를 적용한 대화상자를 생성하는 예문이며 체크 박스의 구성을 위해서 문자열 배열인
m_singer 와 boolean 형 배열인 m_multi_select_result 를 멤버 변수로 선언해 두었습니다.
// 리스트로 구성할 항목을 구성한다.
String[] m_singer = {"Tiara", "BigBang", "GG", "2PM", "SISTAR"};
// 체크박스를 사용할 때 어떤 항목이 선택되었는지 저장할 배열
boolean[] m_multi_select_result = null;
// 대화상자를 생성하는 콜백 메소드
protected Dialog onCreateDialog(int id)
{
Dialog dialog = null;
switch(id) {
case ID_CHECK_DIALOG : {
// AlertDialog 를 생성해주는 AlertDialog.Builder 객체를 생성한다.
AlertDialog.Builder builder = new AlertDialog.Builder(this);

// 대화상자의 제목을 설정한다.
builder.setTitle("Check Your Favorite Singer!");
// 대화상자의 아이콘을 설정한다.
builder.setIcon(R.drawable.icon);

// 대화상자에서 사용할 체크 박스의 항목을 설정한다.
// 첫번째 매개변수는 여러개의 체크 박스 항목을 문자열로 구성한 배열이고,
// 두번째는 대화상자가 실행됐을 때 초기에 선택되어지는 체크 여부 배열이며,
// 세번째는 체크버튼을 클릭했을 때 발생하는 이벤트를 처리하는 리스너를 설정한 것이다.
builder.setMultiChoiceItems(m_singer, m_multi_select_result, new DialogInterface.OnMultiChoiceClickListener() {
// 체크박스가 클릭될 때마다 이 메소드가 호출된다.
// which 는 선택된 체크박스의 인덱스이며 isChecked 는 선택여부이다.
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
m_multi_select_result[which] = isChecked;
}
});
// 좌측(Positive Button) 에 출력될 버튼을 설정한다.
// 해당 버튼을 클릭했을 때 처리할 문장을 리스너로 구성해준다.
builder.setPositiveButton("O~K!", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
String str = " ";
// 텍스트뷰에 출력할 문자열을 구성한다
for(int i = 0; i < LIST_ITEM_COUNT; i++){
if(m_multi_select_result[i] == true) str = str + m_singer[i] + " ";
}
m_display_view.setText(str);
}
});

// 우측(Negative Button) 에 출력될 버튼을 설정한다.
// 해당 버튼을 클릭했을 때 처리할 문장을 리스너로 구성해준다.
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// 대화상자를 취소하여 닫는다.
dialog.cancel();
}
});

// 위에서 설정한 값을 이용하여 대화상자를 생성한다.
dialog = builder.create();
break;
}

// ... 생략 ...
}
return dialog;
}

 

댓글