12장 대화상자
앞서 4장에서 Toast를 사용해서 잠시 동안 사용자가 볼수 있는 방법이 있다.
하지만 사용하기 간편하지만 잠시나탔다가 사라지고 단순히 어떤사실만 알릴뿐이다.
그래서 좀더 복잡한 메시지를 전달할 때 AlertDialog클래스를 사용한다. AlertDialog클래스의 자체 생성자가 protected로 숨겨져 있기대문에 내부 클래스인 Builder를 통해 생성한다. 보아하니. 내부클래스의 super로 값을 넘겨주나보다
AlertDialog.Builder(Context context)
통해서 액티비티에 전달하고 다음메서드들을 통해서 여러가지를 지정한다.
AlertDialog.Builder setMessage(CharSequence message)
AlertDialog.Builder setTitle(CharSequence title)
AlertDialog.Builder setIcon(int iconId)
대화상자 메시지, 타이틀바의 문자열, 아이콘을 지정한다.
btn.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
//* 빌더 생성 후 속성 설정
AlertDialog.Builder bld = new AlertDialog.Builder(DialogTest.this);
bld.setTitle("알립니다.");
bld.setMessage("대화상자를 열었습니다.");
bld.setIcon(R.drawable.icon);
bld.show();
//*/
/* 연쇄적인 호출
new AlertDialog.Builder(DialogTest.this)
.setTitle("알립니다.")
.setMessage("대화상자를 열었습니다.")
.setIcon(R.drawable.icon)
.show();
//*/
}
});
버튼에 대한 클릭리스너를 생성하고 그안에 Click을 했을경우 대화상자를 생성하는것이다.앞에 설명한... AlertDialog.Builder를 통해 생성하고 매서드 3개로 제목 메시지 아이콘을 지정후 show()를 통해서 화면을 보여준다.
아주 간단하다.
==========================================================================================
대화상자의 버튼
대화상자에 버튼을 배치할때 최대 3개가지 버튼을 표시할수잇다.
setPositiveButton(CharSequence text, DialogInterface.OnClickListener listener)
setNeutralButton(CharSequence text, DialogInterface.OnClickListener listener)
setNegativeButton(CharSequence text, DialogInterface.OnClickListener listener)
.setPositiveButton("닫기", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
}
})
.setNegativeButton("닫기", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
}
})
.setPositiveButton("닫기", null)
이렇게 사용할수 있다. 단지 버튼을 클릭했을때 변화되는건 없게 만들었다.
대화상자 미리 생성
대화상자를 생성할경우.. 화면에 새로 만들고 다시 파괴하고 이런방법이면 정말 자원관리상 비효율적이다. 그래서 매번생성하지 않고 미리 대화상자를 만든후 보이게 해주는것이다. 그래서 세 메서드를 사용한다.
void showDialog(int id)
void dismissDialog(int id)
void removeDialog(int id)
이 메서드를 사용하려는 액티비티는 대화상자를 관리하는 다음 메서드를 반드시 재정의해야한다.
Dialog onCreateDialog(int id)
void onPrepareDialog(int id, Dialog dialog)
============================================================================================
protected Dialog onCreateDialog(int id) {
switch (id) {
case SampleDialog:
return new AlertDialog.Builder(ShowDialog.this)
.setTitle("알립니다.")
.setMessage("대화상자를 열었습니다.")
.setIcon(R.drawable.icon)
.setPositiveButton("닫기", null)
.create();
case QuestionDialog:
return new AlertDialog.Builder(ShowDialog.this)
.setTitle("질문")
.setMessage("밥 먹었어요?")
.setPositiveButton("먹었다", null)
.setNegativeButton("굶었다", null)
.create();
}
return null;
}
protected void onPrepareDialog(int id, Dialog dialog) {
super.onPrepareDialog(id, dialog);
switch (id) {
case SampleDialog:
break;
case QuestionDialog:
Calendar calendar = Calendar.getInstance();
String stime = String.format("%d시 %d분 %d초",
calendar.get(Calendar.HOUR_OF_DAY),
calendar.get(Calendar.MINUTE),
calendar.get(Calendar.SECOND));
dialog.setTitle(stime);
break;
}
}
AlertDialog.Builder 통해 구현이 아니라. showDialog을 통해서 이 생성한 대화상자를 불러온다.
Protected Dialog onCreateDialog로 대화상자를 불러오고 onPrepareDialog를 통해서 대화상자의 상태에 다라서 대화상자를 갱신해준다.
=========================================================================================
대화상자는 버튼을 3개까지 할수 있다. 하지만 대화상자를 목록으로 반들면.. 가능하다.
그메소드는
setitems (CharSequence[] items, DialogInterface.OnClickListener listener)
setitems(int itemsId, DialogInterface.OnClickListener listener)
목록이 선택되었을때 동작정의는 아래 메서드를 구현해야한다.
void onClick(DialogInterface dialog,int which)
인수로는 사용자가 선택하 항목의 첨자가 전달된다. 제일 위쪽의 첫번째항목이 0번이고 아래쪽으로 순서대로 증가한다.
new AlertDialog.Builder(SelectDialog1.this)
.setTitle("음식을 선택하시오.")
.setIcon(R.drawable.icon)
.setItems(R.array.foods,
// .setItems(new String[] {"짜장면", "우동", "짱뽕", "탕수육" },
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
String[] foods = getResources().getStringArray(R.array.foods);
TextView text = (TextView)findViewById(R.id.text);
text.setText("선택한 음식 = " + foods[which]);
}
})
.setNegativeButton("취소", null)
.show();
보다시피
.setItems(R.array.foods,DialogInterface.OnClickListener(){}로 되어있다.
그리고 onClick을 했을때.. 리소스에 있는 배열로 가져오고 그것을 text에 찍어서 가져온다. 여기서 which는 선택한 항목이다.
단 setItems는 setMessage와 같이 사용할수없다.
======================================================================================
===========================================================================================
커스텀 대화상자 앞서 나온 대화상자들은 일단 지정되어있다. 하지만 더 복잡한 정보를 보여 주거나 입력받으려면 커스텀 뷰를 사용해야한다.
setView(View view)
final LinearLayout linear = (LinearLayout)
View.inflate(OrderDialog.this, R.layout.order, null);
new AlertDialog.Builder(OrderDialog.this)
.setTitle("주문 정보를 입력하시오.")
.setIcon(R.drawable.icon)
.setView(linear)
.setPositiveButton("확인", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
EditText product = (EditText)linear.findViewById(R.id.product);
EditText number = (EditText)linear.findViewById(R.id.number);
CheckBox paymethod = (CheckBox)linear.findViewById(R.id.paymethod);
TextView text = (TextView)findViewById(R.id.text);
text.setText("주문 정보 " + product.getText() + " 상품 " +
number.getText() + "개." +
(paymethod.isChecked() ? "착불결제":""));
}
})
.setNegativeButton("취소", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
TextView text = (TextView)findViewById(R.id.text);
text.setText("주문을 취소했습니다.");
}
})
.show();
}
});
=======================================================================
LinearLayout 통해 view을 생성한...그리고 inflate를 통해 리소스를 가져다가 넣어준다. 그후 dialog에 setView(liner)넣어준다. 그리고 확인버튼과 취소버튼을 만든후 버튼에 따라 동작하는부분을 다르게 해줬다.
==================================================================
팝업 윈도우
임의의 뷰를 담을수 있는 컨테이너로서 현재 액티비티의 위쪽에 임시적으로 잠시 열리는 윈도우 이다.
public PopupWindow()
public PopupWindow(View contentView)
public PopupWindow(int width,int height)
public PopupWindow(View contentView,int width,int height,boolean focusable)
위 생성자중에서 보통 4번째 것을 많이 사용한다. 첫번째 인수는 팝업 안에 배치할 내용 뷰이며 대화상자의 커스텀 뷰에 해당한다. 두번째 세번째 인수는 팝업 윈도우의 크기며 네번째 인수는 키보드 입력을 받을 수 있는지 지정한다.
만약 디폴트로 생성될경우 다음 속성을 정해야한다.
public void setContentView(View contentView)
public void setWidth(int width)
public void setHeight(int height)
public void setFocusable(boolean focusable)
public void showAtLocation(View parent, int gravity,int x,int y)
public void showAsDropDown(View anchor [ ,int xoff,int yoff])
showAtLocation메서드는 부모의 지정한 좌표에 팝업을 출력한다.
위치를 나타낸다.
public void dismiss()
public boolean isShowing()