Dialog
사용자에게 메시지를 출력하고 사용자로부터 입력을 받는 인터페이스
AlertDialog • DatePickerDialog / TimePickerDialog
AlertDialog
AlertDialog는 Activity 클래스를 이용해서 구현할 수 있다.
public class MainActivity extends AppCompatActivity {
Button mButton1;
private static final int DIALOG_YES_NO_MESSAGE = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton1 = (Button)findViewById(R.id.button1);
mButton1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showDialog(DIALOG_YES_NO_MESSAGE);
}
});
}
showDialog()를 통해 대화상자를 호출한다.
@Override
protected Dialog onCreateDialog(int id) {
switch(id) {
case DIALOG_YES_NO_MESSAGE:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("메시지")
.setMessage("종료하시겠어요?")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
finish();
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
});
AlertDialog alert = builder.create();
return alert;
}
return null;
}
}
onCreateDialog는 showDialog 함수 호출시 호출되는 메소드이다. AlertDialog.Builder를 통해 대화상자를 설정하고 builder.create()를 통해 설정된 값으로 대화상자를 생성한다.
DialogFragment를 이용하여 AlertDialog 구현하기
Activity 클래스를 이용하는 것 외에 DialogFragment를 이용하는 방식이 있다.
public static class ButtonDialogFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("메시지")
.setMessage("종료하시겠어요?")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
getActivity().finish();
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
});
return builder.create();
}
}
내부적으로 DialogFragment를 상속받는 내부 클래스를 선언하였다.
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
//...
getActivity().finish();
첫번째 방법과 다른 점은 this 부분이 getActivity()로 바꼇다는 점이다.
mButton1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DialogFragment dialogFragment = new ButtonDialogFragment();
dialogFragment.show(getSupportFragmentManager(), "test");
}
});
해당 리소스에 리스너를 등록한다. 이 때 getSupportFragmentManager()를 이용하여 FragmentManager를 가져온다.(지원 라이브러리 사용할 경우)
DatePickerDialog
DialogFragment를 이용하여 구현한다.
public static class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
TextView mT;
public void setEditText(TextView et) {
mT = et;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Calendar cal = Calendar.getInstance();
return new DatePickerDialog(getActivity(), this, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE));
}
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
mT.setText(year + "/" + (monthOfYear + 1) + "/" + dayOfMonth);
}
}
onCreateDialog와 onDateSet 함수를 사용한다.
DatePickerDialog(Context context, DatePickerDialog.OnDateSetListener listener, int year, int month, int dayOfMonth)
Button bt = (Button) findViewById(R.id.button);
// 버튼을 클릭했을 때 대화상자를 표시하도록 처리
// OnClickListener를 설정(무명클래스로 이벤트 리스너 객체를 생성하는 방식)하고 onClick 메소드 구현
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TextView editText = (TextView) findViewById(R.id.dateText);
DatePickerFragment dpf = new DatePickerFragment();
dpf.setEditText(editText);
dpf.show(getFragmentManager(), "datePicker");
}
});