이번에 해볼 것은 날짜와 시간을 입력받을 수 있는 Dialog를 만들어 보는 것이다.
이번에도 이전에서 Dialog를 만들었듯이 Dialog클래스를 따로 만들어서 한 거랑 Activity 클래스 내에서 Dialog 처리를
한 것이랑 같이 묶어 놨다.
이전에 써놓은 Dialog를 확인해보고 오면 이해하는데 좀 더 수월 할 것 같다.
wpioneer.tistory.com/44?category=1011784
자 그럼 xml부터 보자.
xml로는 버튼 두 개 만들고 각각의 버튼마다 onClick 메소드를 걸어둔 것 말고는 특별한 게 없다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="날짜 입력하기"
android:textSize="25dp"
android:layout_gravity="center"
android:onClick="onClickDate"/>
<Button
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="시간 입력하기"
android:textSize="25dp"
android:layout_gravity="center"
android:onClick="onClickTime"/>
</LinearLayout>
화면
자 그럼 이제 자바 소스를 보자
MainActivity 클래스를 먼저 살펴보자
public class MainActivity extends AppCompatActivity implements TimePickerDialog.OnTimeSetListener {
Button b1;
Button b2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//버튼 불러옴
b1 = (Button) findViewById(R.id.date);
b2 = (Button) findViewById(R.id.time);
}
public void onClickDate(View view) {
//date가 클릭했을때 진입
final Calendar cal = Calendar.getInstance(); //현재 시간을 받아옴
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
//현재 날짜로부터 각각 년,월,일 을 받아옴
//DatePickerDialog을 액티비티 내에서 선언하고 만듬
DatePickerDialog datePickerDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
@Override
//DatePicker에서 날짜가 선택되었을때
public void onDateSet(DatePicker datePicker, int year, int monthOfYear, int dayOfMonth) {
//선택된 날짜로 위에서 받아온 버튼의 text 설정 변경
b1.setText(year+"년 "+monthOfYear+"월 "+dayOfMonth+"일");
}
},year, month, day); //datePicker를 생성할때 날짜를 생성해주는 부분 그래서 위에서 생성한 날짜를 넣음
datePickerDialog.show(); //datePicker 보여주기
}
public void onClickTime(View view) {
//DialogFragment 형식의 객체를 생성해주는데 자바의 다형성을 이용해서
//DialogFragment를 상속받은 자식 클래스를 담을수 있게 해서 생성한다.
DialogFragment df = new TimPickerDialog();
//df 즉 TimePickerDialog를 fragmentManager를 통해서 보여준다.
df.show(getSupportFragmentManager(),"Time Picker");
}
@Override
//TimePickerDialog에서 시간이 선택됐을때 진입
public void onTimeSet(TimePicker timePicker, int hour, int minute) {
//여기서는 시간이 선택될때의 할 일들을 적으면 된다.
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, hour);
cal.set(Calendar.MINUTE,minute);
//선택됐을때의 시간을 Calendar에 세팅한다.(kk로 하면 24시간 형태로 나온다)
SimpleDateFormat sdf = new SimpleDateFormat("kk:mm");
String time = sdf.format(cal.getTime());
//그리고 설정된 시간을 SimpleDateFormat가지고 String으로 변환해서
//버튼의 Text 변경
b2.setText(time);
}
}
여기서 보면 onClickDate()는 해당 액티비티에서 DatePickerDialog 객체를 생성해서 만들어줬다.
그리고 그 객체 내에서 OnDateSetListener를 만들어줬다.
하지만 TimePickerDialog는 따로 클래스 파일을 만들어서 해당 클래스 파일로
객체를 생성해줬다.
TimePickerDialog 클래스
public class TimPickerDialog extends DialogFragment {
@NonNull
@Override
//Dialog를 생성해줄 onCreateDialog를 DialogFragment로 부터 상속받아 만들어준다.
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
//그래서 우리는 TimePickerDialog를 생성해서 이걸 반환해준다.
//TimePickerDialog의 매개변수로는 Context와 onTimeSetListener를 반환해주는데
//onTimeSetListener는 반환 받는 Activity쪽에서 생성할수 있도록 한다.
//그리고 Dialog를 생성했을때 설정해둘 시간과 분도설정해서 Dialog를 설정하고 초는 false를 줘서 만들지않는다..
Calendar cal = Calendar.getInstance();
int hour = cal.get(Calendar.HOUR_OF_DAY);
int minute = cal.get(Calendar.MINUTE);
//그리고 Dialog를 생성했을때 설정해둘 시간과 분도설정해서 Dialog를 설정하고 초는 false를 줘서 만들지않는다..
return new TimePickerDialog(getActivity(),(TimePickerDialog.OnTimeSetListener) getActivity(),hour,minute,false);
}
}
위 TimePickerDialog 클래스 파일을 보면
return new TimePickerDialog(getActivity(),(TimePickerDialog.OnTimeSetListener) getActivity(), hour, minute, false);
가 있는데 해당 부분은 이제 TimePickerDialog 객체를 생성해서 생성한 TimePickerDialog 객체를 반환한다는 것이다.
TimePickerDialog()는 생성할 때 매개변수로
TimePickerDialog(context, OnTimeSetListener, 시간, 분) 을 입력받는다.
context는 getActivity()로 받았고
OnTimeSetListener는 (TimePickerDialog.OnTimeSetListener) getActivity()로 설정해
해당 Lisetner를 사용하는 Activity에서 override 하게 했다.
그리고 Calendar로 시간과 분은 현재 시간을 입력받게 했다.
그래서 MainActivity는 위에서 언급했듯
TimePickerDialog에서 OnTimeSetListener 을 구현하도록해서
implements TimePickerDialog.OnTimeSetListener 를 클래스 초입부에 적은뒤
해당 메소드를 implements 했다
그리고 TimePickerDialog 클래스는 DialogFragment를 상속받았기 때문에
( 위 소스에서 public class TimPickerDialog extends DialogFragment{} )
onClickTime 메소드에서 DialogFragment df = new TimPickerDialog();가 성립이 된다.
(다형성)
따라서 onClickTime()에 진입하면 df.show()해서 Dialog가 생성이 된다.
하지만 해당 df는 Avtivity가 아닌 TimPickerDialog 클래스에 있는 것이기 때문에
매개변수로 getSupportFragmentManager() (fragment)를 태그와 함께 넘겨주는 것이다.
( 위 소스에서 df.show(getSupportFragmentManager(),"Time Picker"); )
'코딩일기 > android studio' 카테고리의 다른 글
안드로이드 독학 18일차 : 커스텀 대화상자(Custom Dialog) (0) | 2021.04.08 |
---|---|
안드로이드 독학 18일차 : 상황에 따른 버튼 클릭 이벤트 처리 (0) | 2021.04.08 |
안드로이드 독학 16일차 : Dialog(대화상자) (2) | 2021.03.31 |
안드로이드 독학 16일차 : 팝업 메뉴(PopupMenu) (2) | 2021.03.31 |
안드로이드 독학 15일차 : 컨텍스트 액션 모드(Context ActionMode) (0) | 2021.03.30 |