Android (안드로이드)

[Android] Dialog / 다이얼로그 / 체크박스 / 라디오버튼 / 외부 터치 제한

Oscar:) 2024. 1. 8. 15:50
728x90

 

 

이번 포스팅에서는 다이얼로그 사용법에 대해 알아보자.

 

 


 

 

기본 다이얼로그

 

 

기본적인 다이얼로그 문법은 다음과 같다.

 

onCreate() 부분까지 작성하겠다.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_dialog);

    Button showDialogBtn = findViewById(R.id.dialogBtn);

    showDialogBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            // 다이얼로그
            new AlertDialog.Builder(DialogActivity.this) // Context
                    .setTitle("Dialog") // 제목
                    .setMessage("다이얼로그 테스트입니다.") // 내용
                    .create() // 생성하고
                    .show(); // 보여진다

        }
    });

}

 

 

버튼을 누르면 다이얼로그가 띄워지는 java 코드다.

xml 파일은 따로 업로드 하지 않으니, 입맛대로 만들기 바란다.

 

버튼 초기화 및 OnClickListener 부분은 넘어가고,

onClick() 메서드 부분을 보면 된다.

 

 

AlertDialog 클래스로 다이얼로그를 생성해준다.

각 메서드에 대한 간단한 설명을 주석으로 작성해 놓았으니 확인하기 바란다.

제목과 내용만 들어간 매우 간단한 다이얼로그다.

 

실행 결과는 다음과 같다.

 

 

 


 

확인 · 취소 버튼 다이얼로그

 

 

위 다이얼로그에 확인 · 취소 버튼을 추가해보자.

 

아래부터는 onCreate() & 버튼 클릭리스너는 생략하겠다.

new AlertDialog.Builder(DialogActivity.this)
    .setTitle("Dialog")
    .setMessage("다이얼로그 테스트입니다.")
    .setPositiveButton("확인", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {

            // TODO

        }
    })
    .setNegativeButton("취소", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {

            // TODO

        }
    })
    .create()
    .show();

 

*Positive - 긍정

*Negative - 부정

 

각 Button 메서드의 첫 번째 인수에 버튼에 들어갈 텍스트를 작성해 주고,

두번째 인수에는 클릭리스너를 작성해 주면 된다.

 

클릭리스너의 onClick() 메서드 안에 클릭 후의 동작을 구현하면 된다.

 

결과는 다음과 같다.

 

 

 

AlertDialog 클래스에서는 다이얼로그 버튼에 기본적인 위치가 지정되어 있다.

 

*setPositiveButton - 오른쪽

*setNegativeButton - 왼쪽

 

 


 

리스트 다이얼로그

 

 

사용자에게 여러 선택지를 제공하는 리스트 다이얼로그를 만들어보자.

String[] array = {"오스카", "샘", "밥"};

new AlertDialog.Builder(DialogActivity.this)
    .setTitle("가장 멋진 사람을 고르시오.")
    .setItems(array, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {

            Log.d(TAG, "가장 멋진 사람 : " + array[i]);

        }
    })
    .create()
    .show();

 

 

간단한 배열을 생성해주고,

setItems() 메서드의 첫번 째 인수에 작성해 주면 된다.

 

두번 째 인수에는 클릭리스너를 작성해주고,

사용자가 클릭한 아이템을 Log로 확인해 보자.

 

 

 

가장 멋진 사람인 '오스카'를 클릭했다.

Logcat에서 onClick() 메서드의 두번 째 매개변수 i 값을 잘 받아왔는지 확인해보자.

 

 

0번 째 인덱스에 있던 '오스카'가 잘 출력되었다.

 

 


 

체크박스 다이얼로그

 

 

이번에는 여러 선택지 중, 다중 선택을 할 수 있는

체크박스 다이얼로그를 만들어 보자.

// 전역 변수 초기화
String[] stringArray = {"오스카", "샘", "밥", "테론"};
boolean[] booleanArray = {false, false, false, true};

// showDialog 버튼 onClick()
Log.d(TAG, "완료 누르기 전 : " + Arrays.toString(booleanArray));

new AlertDialog.Builder(DialogActivity.this)
    .setTitle("귀여운 사람을 모두 고르시오.")
    .setMultiChoiceItems(stringArray, booleanArray, new DialogInterface.OnMultiChoiceClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i, boolean b) {

            Log.d(TAG, "onItemClick : " + i);
            Log.d(TAG, "onItemChecked : " + b);

        }
    })
    .setPositiveButton("완료", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {

            Log.d(TAG, "완료 누른 후 : " + Arrays.toString(booleanArray));

        }
    })
    .create()
    .show();

 

아이템 배열 stringArray, stringArray의 체크 유무 배열 booleanArray를 초기화 해준다.

 

setMultiChoiceItems() 메서드를 사용하여 체크박스 다이얼로그를 사용할 수 있다.

 

첫번 째 인수에는 아이템 리스트에 해당하는 배열을 넣어주고,

두번 째 인수에는 체크 유무 리스트에 해당하는 배열을 넣어주고,

세번 째 인수에는 클릭리스너를 넣어준다.

 

 

다이얼로그에 해당하는 코드에서는 변수 초기화 등 어떠한 작업도 하지 않았고,

다이얼로그가 띄워질 때, 아이템 클릭 시, 완료 버튼 누를 때

이렇게 3번 로그만 찍어 놓은 코드다.

 

여기서 주목해야 할 점은,

전역변수 booleanArray의 데이터 변화다.

 

 

전역변수 booleanArray가 {false, false, false, true} 로 초기화되어있기 때문에

처음 다이얼로그가 띄워졌을 때는 마지막 아이템에만 체크가 되어있다.

 

첫번 째 아이템에도 체크 후 완료를 누르고,

다시 다이얼로그를 띄우면 첫번 째, 마지막 아이템에 체크가 되어있다.

 

 

첫번 째 아이템 체크 후, booleanArray 변수에 초기화하는 등의 작업을 하지 않았는데도

booleanArray의 값이 자동으로 바뀐 상태로 저장된 것을 확인할 수 있다.

 

 


 

라디오버튼 다이얼로그

 

 

라디오버튼 형태의 다이얼로그를 만들어 보자.

// 전역 변수 초기화
String[] stringArray = {"오스카", "샘", "밥", "테론"};
int checkedItemPosition = 0;

// showDialog 버튼 onClick()
Log.d(TAG, "완료 누르기 전 : " + checkedItemPosition);

new AlertDialog.Builder(DialogActivity.this)
    .setTitle("제일 귀여운 사람을 고르시오.")
    .setSingleChoiceItems(stringArray, checkedItemPosition, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {

            Log.d(TAG, "onClick : " + i);
            checkedItemPosition = i;

        }
    })
    .setPositiveButton("완료", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {

            Log.d(TAG, "완료 누른 후 : " + checkedItemPosition);

        }
    })
    .create()
    .show();

 

 

위 체크박스 다이얼로그와 전체적으로 비슷한 느낌이다.

 

조금 다른 점을 이야기하자면

setSingleChoiceItems() 메서드를 사용하고,

두번 째 인수에 boolean[] 배열이 아닌, 선택되어 있을 인덱스 값을 넣어주면 된다.

 

체크박스 다이얼로그와는 다르게,

선택된 값이 자동으로 변수에 초기화되지 않는다.

 

따라서 아이템을 클릭했을 때 변수에 직접 초기화해줘야 한다.

 

 

 

0번 인덱스 값 '오스카' 에서

3번 인덱스 '테론'을 선택 후 다시 다이얼로그를 띄우면

'테론'으로 선택되어 있는 것을 확인할 수 있다.

 

 

 


 

기타 속성

 

 

 setIcon()

 

다이얼로그의 제목 옆 부분에 이미지를 넣을 수 있는 메서드다.

 

위 메서드의 인수에 이미지 파일을 넣어주면 된다.

new AlertDialog.Builder(DialogActivity.this)
    .setTitle("제일 귀여운 사람을 고르시오.")
    .setItems(stringArray, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            // TODO
        }
    })
    .setIcon(R.drawable.touch)
    .create()
    .show();

 

손가락 모양의 이미지를 준비해서 넣어보았다.

 

 


 

setCancelable(false)

 

기본적으로 다이얼로그 영역 밖의 부분을 터치하면 다이얼로그가 사라진다.

하지만 종종 선택지 이외의 진입을 제한하고 싶을 때가 있다.

 

위 메서드를 사용하면 다이얼로그 영역 밖의 부분을 터치해도

다이얼로그가 사라지지 않게 할 수 있다.

 

 


 


 

 

 

오늘은 다이얼로그 사용법에 대해 알아보았다.

다이얼로그는 여러 곳에서 정말 다양하게 사용할 수 있는 것 같다.

 

다음 포스팅에서는 커스텀 다이얼로그에 대해 알아보겠다.

 

 

728x90