본문 바로가기
코딩일기/android studio

안드로이드 독학 17일차 : DatePickerDialog & TimePickerDialog

by 욱파이어니어 2021. 4. 1.
728x90
반응형

이번에 해볼 것은 날짜와 시간을 입력받을 수 있는 Dialog를 만들어 보는 것이다.

 

이번에도 이전에서 Dialog를 만들었듯이 Dialog클래스를 따로 만들어서 한 거랑 Activity 클래스 내에서 Dialog 처리를 

한 것이랑 같이 묶어 놨다. 

 

이전에 써놓은 Dialog를 확인해보고 오면 이해하는데 좀 더 수월 할 것 같다.

wpioneer.tistory.com/44?category=1011784

 

안드로이드 독학 16일차 : Dialog(대화상자)

이번에 알아볼 것은 Dialog이다. 이건 뭐냐면 우리가 어떤 특정 뷰를 눌렀을 때 뜨는 것이다. ex) 그럼 이제 해당 부분을 만드는 방법을 알아보자. 이건 xml로 설정해주는 부분은 버튼 하나 만든 거

wpioneer.tistory.com

 

자 그럼 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"); )

반응형