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
대화상자에서 날짜와 시간을 선택하게 해준다.
사용법은 기본 다이얼로그와 마찬가지로 간단하다.
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();
}
});
알아두면 적용할 곳이 많다.
끝!