[Android/Java] 다이얼로그(Dialog)+커스텀 다이얼로그(Custom Dialog)
[모든 포스팅은 개인적 공부를 위해 작성된 글입니다]
<대화상자>
- Toast 메시지처럼 일방적으로 메시지를 전달하는 것이 아닌 사용자로부터 '예', '아니오'와 같은 응답 받아 처리
<다이얼로그 dismiss, cancel 차이>
- dismiss : 다이얼로그의 버튼 클릭하여 종료된 경우(안전한 종료)
- cancel : 뒤로가기 버튼 눌러 종료된 경우
<대화상자 생성 과정>
1. 대화상자 만들기 위한 Builder 객체 생성
AlertDialog.Builder builder = new AlertDialog.Builder(this);
2. 대화상자에서 사용할 버튼 추가
- 긍정(Positive) 버튼 추가(setPositiveButton)
builder.setPositiveButton("예", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
- 부정(Negative) 버튼 추가(setNegativeButton)
builder.setNegativeButton("아니요", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
- 중립(Neutral) 버튼 추가(setNeutralButton)
builder.setNeutralButton("아니요", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
3. 대화상자 객체 생성 후 보여주기
AlertDialog alertDialog = builder.create();
alertDialog.show();
<AlertDialog.Builder 관련 메서드>
1. setCancelable
- 다이얼로그는 기본적으로 뒤로가기 버튼을 누르거나 다이얼로그 바깥을 누른 경우 대화 창이 무시되고 종료됨
- setCancelable 메서드를 통해 종료되는 것을 막을 수 있음
- true로 설정한 경우 -> 종료됨
builder.setCancelable(true);
- false로 설정한 경우 -> 종료되지 않음
builder.setCancelable(false);
<다이얼로그 커스텀>
1. 원하는 xml로 변경
dialog.setContentView(R.layout.~~~);
2. 제목 제거
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
* 다이얼로그 제목 제거를 가장 먼저 해야 정상적으로 작동됨*
3. 배경 투명하게
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
4. 다이얼로그 크기 조절
WindowManager.LayoutParams params = dialog.getWindow().getAttributes();
params.width = WindowManager.LayoutParams.MATCH_PARENT;
params.height = WindowManager.LayoutParams.MATCH_PARENT;
dialog.getWindow().setAttributes(params);
* dialog.show() 뒤에 코드 작성해야 함
- MATCH_PARENT, WRAP_CONTENT 대신 상수 넣고 싶다면 params.width = 200;과 같이 입력하면 됨
5. 뒤로가기 버튼 누른 경우 다이얼로그 cancel되는 것 막기
dialog.setCancelable(false);
6. 다이얼로그를 제외한 배경화면 검은색으로 되는 것 막기
dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
7. 배경 터치하여 cancel되는 것 막기
dialog.setCanceledOnTouchOutside(false);
8. 다이얼로그 밖 View 터치할 수 있게 하기
dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
9. 다이얼로그 호출된 경우 리스너
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialogInterface) {
}
});
10. dismiss된 경우 리스너
dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialogInterface) {
}
});
11. cancel된 경우 리스너
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialogInterface) {
}
});
[계속 추가 예정]
<Fragment에서 다이얼로그 띄우기>
Dialog dialog = new Dialog(getActivity());
dialog.setContentView(R.layout.ticket_registration);
dialog.show();