본문 바로가기

~2023

[Android] Dialog 실습 - show(), Dialog Fragment

728x90
반응형

목차

1. 메소드 설명

2. 작동 화면

3. 코드 리뷰

1. 메소드 설명

Dialog를 구현하기 위해서는 show(), DialogShow(), Dialog Fragment가 있지만, DialogShow()는 더 이상 안드로이드 스튜디오에서 서비스를 제공하지 않아 두 개의 방법으로 구현해봤다.

AlerDialog 클래스를 사용해야 하는데 protected로 접근이 불가능해 AlertDialog의 Builder 필드 멤버를 이용해야 한다.

2. 작동 화면

왼쪽: show() 사용, 오른쪽: Dialog Fragment 사용

 

3. 코드 리뷰

Button btDialog = findViewById(R.id.btDialog); // 버튼 객체
btDialog.setOnClickListener(new View.OnClickListener() {
	
    @Override
    public void onClick(View v) {
    	// 1
        AlertDialog.Builder adBuilder = new AlertDialog.Builder(MainActivity.this);
        adBuilder.setTitle("Notice");
        adBuilder.setMessage("Time out!");
        adBuilder.setIcon(R.mipmap.ic_launcher_round);
        adBuilder.show();
        
        // 2
        new AlertDialog.Builder(MainActivity.this)
        .setTitle("Notice")
        .setIcon(R.mipmap.ic_launcher_round)
        .setMessage("Time out!")
        .setPositiveButton("close", new DialogInterface.OnClickListener() { // 버튼
        	@Override
            public void onClick(DialogInterface dialog, int which) {
            }
		})
        .setCancelable(false) // 버튼을 눌러야만 창이 사라짐
        .show();
	}
});

show()는 AlerDialog.Builder의 객체를 만들어 준 다음에 속성들을 설정해주고 마지막에 show() 메소드를 통해 사용자에게 뷰를 보여준다. 생성자를 결정할 때 this 대신 MainActivity.this를 넘겨줘야 오류가 발생하지 않고 Dialog 뷰는 Title, Message, ...Button으로 나뉜다. 버튼이 3가지 종류가 있지만, 실습에서는 오른쪽 버튼에 해당하는 PositiveButton()만 사용했다.

setPositiveButton()의 매개변수로 텍스트와 리스너를 넘겨야 하는데 창 닫기 용으로 사용할 것이라면 리스너를 구현하지 않던가, null을 넘겨줘도 된다. 그리고 setCancelable(false)로 설정하면 버튼 외 다른 위치를 클릭시 창이 닫히지 않는다.

public static class NoticeDF extends DialogFragment {
   @NonNull
   @Override
   public Dialog onCreateDialog(@Nullable Bundle savedIntanceState) { // 생성만 함, 관리X
      AlertDialog.Builder adBuilder = new AlertDialog.Builder(getActivity()); // 객체 생성
        
      adBuilder.setTitle("Notice")
      .setMessage("Time out!")
      .setIcon(R.mipmap.ic_launcher_round)
      .setPositiveButton("Close", null)
      .setCancelable(false); // 적용 X
        
      return adBuilder.create();
   }
}

Button btNoticeDialog = findViewById(R.id.btNoticeDialog);
btNoticeDialog.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
      DialogFragment noticeDF = new NoticeDF();
        
      noticeDF.setCancelable(false); // 관리는 클래스 밖에서 해야 적용됨
      noticeDF.show(getSupportFragmentManager(), "noticeDF");
   }
});

show()를 통해 뷰를 출력하는 방법은 한 번에 생성과 관리가 가능하지만 Dialog Fragment는 생성하는 구간과 관리하는 구간이 다르다. Dialog Fragment는 DialogFragement를 상속받은 클래스에서 뷰를 생성하고 그 객체를 사용하는 리스너에서 관리를 해야 한다.

위에 코드를 보면 Dialog Fragment를 상속 받은 후에 onCreateDialog() 메소드를 오버라이드한다. onCreateDialog()에는 위에 show() 방식과 마찬가지로 Builder 객체를 이용해 속성을 설정해주면 되는데 차이점이 있다면, onCreateDialog() 리턴값으로 객체.create()이어야 하고 show()를 사용할 때 매개변수로 (getSupportFragmentManager(), '태그명')을 전달해줘야 뷰 사용이 가능하다. 그리고 관리랑 생성을 따로 하기 때문에 setCancelable() 같은 관리 속성은 객체.setCancelable()로 선언해줘야 적용된다.

728x90
반응형