Android/Java

[Android/Java] 다이얼로그(Dialog)+커스텀 다이얼로그(Custom Dialog)

__JeongYeon 2022. 3. 12. 18:53
반응형

[모든 포스팅은 개인적 공부를 위해 작성된 글입니다]

 

<대화상자>

- 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();
반응형