본문 바로가기

MOBILE/android

[Android] AlertDialog, DatePickerDialog, TimePickerDialog: Dialog 모음 및 사용

AlertDialog class

일종의 사용자 대화창이라고 부르는데 나는 그냥 팝업 창이라고 부름

제목, 아이콘, 메세지, 목록, 버튼은 최대 3개까지 지원해준다.

 

사용법은 간단하다.

1. AlertDialog.Builder 객체 생성

2. 원하는 기능에 따라

- 제목: setTitle()

- 아이콘: setIcon()

- 메세지: setMessage()

- 목록: setItems()

- 버튼: setPositiveButton(),setNegativeButton()

으로 설정

3. AlertDialog.Builder 객체에 create() 메서드로 AlertDialog 객체를 생성

4. AlertDialog 객체에 show 메서드로 화면에 표시

alerttButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    	
        // AlertDialog.Builder 객체 생성
        AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this);
        builder.setTitle("제목");
        builder.setIcon(R.drawable.ic_launcher_foreground);
        builder.setMessage("안드로이드 메세지");
        
        // button을 눌렀을 때 처리하는 Interface를 구현
        builder.setPositiveButton("ok", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                Toast.makeText(MainActivity.this, "ok button", Toast.LENGTH_SHORT).show();

            }
        });
        builder.setNegativeButton("no", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                Toast.makeText(MainActivity.this, "no button", Toast.LENGTH_SHORT).show();
            }
        });
        
        // create으로 AlertDialog 객체를 생성 show로 화면에 보여줌
        AlertDialog alertDlg= builder.create();
        alertDlg.show();
    }
});

 

 

이때 여기서 조심해야 하는 점은 builder 객체의 파라미터이다.

다음과 같은 경우 오류를 발생시킨다.

// AlertDialog.Builder 객체 생성
        AlertDialog.Builder builder=new AlertDialog.Builder(getApplicationContext());

 

builder 객체를 생성할 때 파라미터에는 context를 넣어주는데

나는 아무 생각없이 getApplicationContext()를 썼다가 오류를 발견했다.

 android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?

 

이때는 application context가 아니라 Activity의 context를 넘겨야한다. Dialog는 Activity에 종속되어 있기 때문이다.

따라서 getApplicationContext()가 아니라 activity의 context를 넘기면 된다.

getContext() 하거나 나처럼 직접 명세해줘도 됨

context 정리도 해야지...

 

 

 

여러개 선택하는 dialog 창을 만들고 싶다면 builder 객체의 setMultiChoiceItems 메서드를 사용한다.

 

public AlertDialog.Builder setMultiChoiceItems(CharSequence[] items,
                                               boolean[] checkedItems,
                                               android.content.DialogInterface.OnMultiChoiceClickListener listener)

items: 보여질 item들

checkedItems: item들의 초기화 상태

 

다음과 같이 쓰면 된다. 

builder.setMultiChoiceItems(items, status, new DialogInterface.OnMultiChoiceClickListener() {
    @Override
    public void onClick(DialogInterface dialogInterface, int i, boolean b) {
        status[i]=b;
    }
});

이때 중요한점은 setMultiChoiceItems를 사용한다면 setMessage() 메서드를 설정하지 말아야한다.

아니면 선택지가 안보임

 

 

하지만 여기서도 대부분 xml에 레이아웃을 구현해두고 inflater로 가져와서 적용하는 일이 많다.

따라서 다음과 같이 LayoutInflater로 layout을 가져와서 alertdialog에 적용해야한다.

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    	// AlertDialog builder 객체 생성
        AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this);
        
        // layoutinflater로 xml에 쓴 레이아웃 가져와서 builder와 연결
        LayoutInflater inflater=getLayoutInflater();
        View layout=inflater.inflate(R.layout.dialog,null);
        builder.setView(layout);
     
     	// AlertDialog 객체를 생성해서 show로 화면에 보여줌
        AlertDialog alertDlg=builder.create();
        alertDlg.show();
    }
});

 

AlertDialog를 상속받은 대표적인 두가지가 있다.

- DatePickerDialog

- TimePickerDialog

대화상자에서 날짜와 시간을 선택하게 해준다.

DatePickerDialog , TimePickerDialog

사용법은 기본 다이얼로그와 마찬가지로 간단하다.

1. 생성자로 객체 생성

2. show() 메서드로 화면에 출력

 

buttton1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    	// Calender로 날짜 설정
        Calendar c=Calendar.getInstance();
        int year=c.get(Calendar.YEAR);
        int month=c.get(Calendar.MONTH);
        int day=c.get(Calendar.DAY_OF_MONTH);
        
        // 객체 생성하고 리스너 구현 후 show() 메서드로 화면 출력
        new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker datePicker, int i, int i1, int i2) {
                dateStr=String.format("%d/ %d/ %d",i,i1+1,i2);
                datetxt.setText(dateStr);
            }
        }, year,month,day).show();
    }
});

button2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    	// Calender로 시간 설정
        Calendar c=Calendar.getInstance();
        int hour=c.get(Calendar.HOUR_OF_DAY);
        int min=c.get(Calendar.MINUTE);
        
        // 객체 생성하고 리스너 구현 후 show() 메서드로 화면 출력
        new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() {
            @Override
            public void onTimeSet(TimePicker timePicker, int i, int i1) {
                timeStr=String.format("%d : %d",i, i1);
                timetxt.setText(timeStr);
            }
        },hour,min,true).show();
    }
});

알아두면 적용할 곳이 많다.

 

끝!