[Android Studio] DatePickerDialogの使い方（備忘録）

#DatePickerDialogを使ってみた
DatePickerDialogはフラグメントの一種で、写真のような日付選択ツールが使えるようになるらしい。
![スクリーンショット 2021-02-28_DatePickerDialog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1139020/80a2f5b5-fc55-3625-065c-68e68f69b070.png)

フラグメントについてわからなかったので調べてみると、
>フラグメントを作成するには、Fragment（またはその既存のサブクラス）のサブクラスを作成する必要があります。
[（フラグメントを作成する (Android Developers)）](https://developer.android.com/guide/components/fragments?hl=ja#Creating)

とあったので、ほほーそうかと思ってDatePickerDialogのクラスを作ってみた。

```java:DatePickerDialogFragment.java
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.widget.DatePicker;
import androidx.fragment.app.DialogFragment;
import java.util.Calendar;

public class DatePickerDialogFragment extends DialogFragment{

    @Override
    public Dialog onCreateDialog(Bundle savedInstantState){

        //デフォルトのタイムゾーンおよびロケールを使用してカレンダを取得
        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);

        DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(), (DatePickerDialog.OnDateSetListener)getActivity(), year, month, day); //this はonDateSetListener
        return datePickerDialog;
    }
```

```java:TestDatePickerActivity.java

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import java.util.Calendar;

public class TestDatePickerActivity extends AppCompatActivity implements View.OnClickListener, DatePickerDialog.OnDateSetListener{
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);

        textView = findViewById(R.id.textViewTest);
        textView.setOnClickListener(this);

//今日の日付をtextViewにセット
        Calendar c = Calendar.getInstance();
        textView.setText(String.format("%d年%d月%d日", c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH)));
    }

    @Override
    public void onClick(View view) {
        //DatePickerFragmentを表示
        DatePickerDialogFragment datePicker = new DatePickerDialogFragment();
        datePicker.show(getSupportFragmentManager(), "datePicker");
    }

    //DatePickerFragment で日付がセットされたときにtextViewに取得した日付を代入する
    @Override
    public void onDateSet(DatePicker datePicker, int year, int month, int dayOfMonth) {
        textView.setText(String.format("%d年%d月%d日", year, month + 1, dayOfMonth));
    }
```

TestDatePickerActivity には今日の日付が出てきて、テキストをクリックすると先ほどのDatePickerDialogFragmentが呼び出されて日付選択ツールが出てくる。
![スクリーンショット 2021-02-28 165208.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1139020/bffbd99f-484e-55a2-387a-6670a3ac6882.png)


ここで、DatePickerDialogFragmentクラスにOnDateSetメソッドを書いた場合、どのような記述をすれば選択した日付をtestDatePickerActivityに表示できるのかわからなかった。onDateSetメソッドをtestDatePickerActivityで継承したらなんとかできたのでよかったねというお話でした。



####ちなみに…
こちらのサイトなどだと一つのクラスにまとめて書いてある。(https://codinginflow.com/tutorials/android/datepickerdialog)
サブクラスをあえて作る必要はないけれど、読みにくいのでクラスを分けた方がきれいに見えると思う。