본문 바로가기

안드로이드/자바

[안드로이드/Android] Dialog 와 AlertDialog 사용하기

반응형
Dialog 는 대화 상자의 기본 클래스입니다.

 

대화상자란? 

사용자에게 결졍을 내리거나 추가 정보를 입력 하라는 프롬프트를 보내는 작은 창을 말합니다.

AlertDialog는 Dialog의 서브 클래스로 그외 DatePickerDialog,TimePickDialog등이 있습니다. Dialog 사용시 getOwnerActivity()를 통해 상위 엑티비티를 리턴값으로 받을수 있습니다. Dialog는 아래와 같이 사용 할 수 있습니다.  커스텀 하고자 하는 레이아웃을 만들고 inflate 합니다.

private void setDialog() {
	RelativeLayout selectPictureDialog = (RelativeLayout) View.inflate(this, R.layout.dialog_select_picture, null);
	rl_select_photo = (LinearLayout) selectPictureDialog.findViewById(R.id.rl_select_photo);
	rl_select_gallery = (LinearLayout) selectPictureDialog.findViewById(R.id.rl_select_gallery);

	sectionPopupMenuDialog = new Dialog(this);
	sectionPopupMenuDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
	sectionPopupMenuDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
	sectionPopupMenuDialog.setContentView(selectPictureDialog);
}

public methods

  • addContentView(View view, ViewGroup.LayoutParams params)  추가적으로 화면에 보이고자 하는 뷰를 추가 합니다.
  • cancel() - 다이얼로그를 취소하는 기능으로 dismiss와는 다르게 OnCancelListener로 등록한 객체가 있으면 호출후 dismiss를 호출한다.
  • closeOptionsMenu() -코드로 옵션 메뉴를 닫는다, 만약 옵션 메뉴가 이미 닫혀 있다면 아무 일도 하지 않는다.
  • create() - Dialog를 즉시 생성하도록 합니다. override를 하면 안됩니다. 
  • dismiss() - Dialog를 화면에서 즉시 사라지도록 합니다. 

그 외 여러가지 메소드가 있지만 모두 적는건 어려움이 있어 생략하도록 하겠습니다. 

다른 메소드들이 궁금 하신분은 여기를 참조해주세요

 

다이얼로그에 키보드의 입력이 필요한 input method가 없고, 최상단에 뿌려지기를 원한다면 

다음과 같은 플레그를 통해 키보드 위에 뿌려줄 수 있습니다.

 

 getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
         WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

api 문서에서는 dialog 자체를 직접 인스턴스화 하는 것을 지양하고 다른 서브 클래스중 하나를 사용할 것을 권장하고 있습니다.

dialog 서브클래스에는 여러가지가 있습니다. 

먼저 

Alertdialog는 제목하나, 최대 세개의 버튼, 선택 가능한 품목 목록 또는 사용자 지정 레이아우을 표시할 수 있습니다.

private void SetAlertDialog(){
    AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
    alert.setPositiveButton("확인", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
        }
    });
    alert.setNegativeButton("취소", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
        }
    });
    alert.setMessage("메시지");
    alert.show();
}

위의 소스코드와 같이 alertdialog를 생성하려면 alertdialog.builder 클래스를 사용하여 생성자인 builder를 얻어야 합니다

그 후에 여러 가지 메소드를 통해 다이얼로그의 내용을 채운 후 .show()로 화면에 뿌려줍니다.

 

Alertdialog 관련 public methods

  • getButton(int whichButton) - 다이얼로그가 사용중인 버튼중 하나의 객체를 반환합니다.  만약 버튼이 존재하지 않는다면 null 을 반환합니다.
  • getListView() - 다이얼로그가 사용중인 리스트 뷰 객체를 반환합니다.
  • onKeyDown(in keyCode, KeyEven event) - 다이얼로그에서 특정 키가 눌린 상황을 제어 하고자 할때 사용합니다.
  • onKeyUp(in keyCode, KeyEven event) - 다이얼로그에서 특정 키가 올라온 상황을 제어 하고자 할때 사용합니다.
  • setButton(CharSequence text, DialogInterfae.OnClickListener lisener) - 버튼을 추가합니다. 첫번째 파라미터에는 버튼에 보이고자 하는 텍스트를,
  • 두번째 파라미터에는 해당 버튼을 눌렀을때 작동할 클릭 이벤트를 작성합니다.
  • setTitle(CharSequence title) - 다이얼로그의 제목을 설정합니다.

AlertDialog.Builder 관련 public methods

  • setMessage(String text) - 다이얼로그를 통해 보여줄 텍스트 내용을 입력합니다.
  • setCancelable(boolean isCancel) - 백버튼을 통해 다이얼로그를 dimiss 하거나 dimiss 불가능하게 합니다
  • setPositiveButton() , setNagativeButton() , setNeturalButton() 각 세가지 버튼이 존재합니다. 첫번째 파라미터에는 
  • 버튼에 보여질 텍스트를, 두번째 파라미터에는 버튼을 눌렀을때 사용할 클릭 이벤트를 넣습니다.
  • 각 버튼의 위치는 처음 끝 중간 순으로 배치됩니다.
  • alertdialog 에도 리스트를 추가 할 수 있습니다.
private void SetListAlertDialog() {
    final CharSequence[] items = {"1", "2", "3"};
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Number");
    builder.setItems(items, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int position) {
            Log.d("Wony","select item="+items[position]);
        }
    });
    AlertDialog alert = builder.create();

}

먼저 텍스트 배열인 items를 선언하여 초기화 합니다. 

배열에 final을 붙인 이유는 각 리스트가 클릭 됐을때, 각 리스트의 position이 반환되는데 그 포지션을 통해 아이템의 숫자를 아는데 사용합니다.

클릭 리스너 안에는 변하지 않는 값이 들어가야 합니다. 즉 재정의를 막기 위해서 입니다.

 

 

 

 

 

기타 참고 싸이트

 

 

※필자 본인을 위한 포스팅으로써 다소 미흡할 수 있습니다. 그래도 궁금하신점이 있으시다면 최대한 도움을 드리도록 하겠습니다.

반응형