DatePickerDialogで日付を設定(選択)する方法【Android Studio, Java】

スポンサーリンク
Android Studio
ユーザーにカレンダーで日付を設定させたい!!

こういった悩みを解決いたします。もちろんソースコード付きです

通知機能やスケジュール管理など、日付情報を使うことで開発するアプリの幅はぐーんと広がりますよね。

ぜひ参考にしてみてください。

※本記事はJavaのお話になります。(Kotlinについては勉強不足です。。)

Kotlinの方は以下の記事でおそらく似たようなことを解説されていると思います。

qiita.com

スポンサーリンク

環境

– Android Studio 4.0

– 使用言語 Java

スポンサーリンク

日時選択の流れ

日時選択の流れとしては以下になります。

1.EditTextをタップする

                                                    f:id:pikaoichan:20200817125318p:plain

2.カレンダーを表示し、日付を選択する

f:id:pikaoichan:20200817125312p:plain

3.日付を選択すると、EditTextに選択した日付が表示される

f:id:pikaoichan:20200817125315p:plain

実装

実装の大まかな概要としては以下になります。

  • DialogFragmentクラスを継承したクラス(本記事ではDatePickerDialogFragmentクラス)を作成する
  • Activityに、EditTextをタップしたときにDatePickerDialogを表示する処理を記述する
  • DatePickerDialogFragmentクラスに、日付を選択した際の処理を記述する

詳しくみていきましょう。

まずはレイアウトファイル(activity_main.xml)とstring.xmlです。

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
tools:context=".MainActivity">
<EditText
android:id="@+id/etDatePicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="7"
android:hint="@string/etDatePickerHint"
android:inputType="date"
android:focusable="false"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

hint はテキストが何もセットされていないときに薄く表示される文字列です。

focusableをfalseにすることで、タップしたときにキーボードが表示されなくなります。

string.xml

<resources>
<string name="app_name">DateDialogSample</string>
<string name="etDatePickerHint">日付を入力</string>
</resources>

hint で表示する文字列のみ用意しています。

ここからはメインである、ActivityおよびDatePickerDialogFragmentについて解説します。

MainActivity.java

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
  private EditText _etDatePicker; //EditText
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    _etDatePicker = findViewById(R.id.etDatePicker);    //EditTextを取得
    _etDatePicker.setOnClickListener(new etOnClickListener());  //クリックリスナをセット
  }
  public void setTextToEditText(String dateText) {    //EditTextに文字列をセットする関数
    _etDatePicker.setText(dateText);
  }
  public class etOnClickListener implements View.OnClickListener{
    @Override
    public void onClick(View view) {    //タップされたときの処理
      DatePickerDialogFragment datePickerDialogFragment = new DatePickerDialogFragment(); 
      //DatePickerDialogFragmentクラスのインスタンスを生成
      datePickerDialogFragment.show(getSupportFragmentManager(), "DatePickerDialogFragment"); //ダイアログを表示
    }
  }
}

DatePickerDialogFragment.java

import android.app.DatePickerDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.widget.DatePicker;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
import java.util.Calendar;
public class DatePickerDialogFragment extends DialogFragment {
  @NonNull
  @Override
  public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { //ダイアログを生成する処理
    Calendar calendar = Calendar.getInstance(); //現在の日時情報を持つカレンダーオブジェクトを取得
    final MainActivity mainActivity = (MainActivity) getActivity(); //現在のアクティビティを取得
    DatePickerDialog datePickerDialog = new DatePickerDialog(   //DatePickerDialogオブジェクトを生成
      mainActivity,   //第1引数(Activity)
      new DatePickerDialog.OnDateSetListener() {  //第2引数(日付が設定されたときのリスナ)
        @Override
        public void onDateSet(DatePicker datePicker, int year, int month, int dayOfMonth) { //日付が設定されたときの処理
          String dateText = (month + 1) + "月" + dayOfMonth + "日"; //"〇月×日"の文字列を生成
          mainActivity.setTextToEditText(dateText);   //EditTextに文字列を設定
        }
      },
      calendar.get(Calendar.YEAR),    //第3引数(西暦初期値)
      calendar.get(Calendar.MONTH),   //第4引数(月初期値)
      calendar.get(Calendar.DAY_OF_MONTH) //第5引数(日初期値)
    );
    return datePickerDialog;
  }
}

まずは、ActivityのOnCreateでEditTextを取得し、クリックリスナをセットします。

そしてそのリスナのOnClickでダイアログを表示する処理を記述します。

DatePickerDialogFragmentクラスでは、ダイアログを生成する処理や日付が選択されたときの処理などを記述しています。

生成するDatePickerDialogのコンストラクタは引数が5つあります。

第2引数はユーザーの日付選択が完了したときに呼ばれるリスナ(DatePickerDialog.OnDateSetListener)になります。その中のOnDateSetで具体的な処理を記述します。

今回は選択された月日を文字列に変換し、EditTextに表示するシンプルな処理としています。

注意ですが、Calendarオブジェクトのmonthは0 ~ 11で月を表しています

文字列に変換するときは month + 1としないとおかしくなってしまいますので気を付けましょう。

第3,4,5引数は表示するDatePickerDialogの年月日の初期値になります。

今回は現在の日付を表すCalendarオブジェクトを参照し、現在の日付を初期値としています。

2020年8月17日に撮影しました。

              f:id:pikaoichan:20200817125312p:plain
初期値が当時になっているのが分かりますね。

おわりに

いかがでしたでしょうか。

今回はAndroidアプリで日付を選択する処理の解説をしました。

↓↓↓↓同様に日付の選択方法を見たい方はこちら↓↓↓↓

TimePickerDialogで時刻を設定(選択)する方法[Android Studio, Java]
Androidアプリで時計を表示し、ユーザーに時刻を選択してもらう方法を分かりやすく解説します!

以上です。ありがとうございました。

コメント

タイトルとURLをコピーしました