日時の扱い方(DatePickerDialog, TimePickerDialog, DialogFragment)
(ブログ記事の一覧は「こちら」)
日付や時間を入力するためのコンポーネントとして、DatePicker, TimePicker が用意されています。また、それぞれを入力するためのダイアログとして DatePickerDialog, TimePickerDialog が用意されています。
それぞれのダイアログは、新たに作成する DialogFragment クラスから呼び出す必要があります。
ここで学ぶこと
- DatePickerDialog(日付を入力するためのダイアログ)
- TimePickerDialog(時間を入力するためのダイアログ)
- DialogFragment(Pickerを呼び出すのに使用することが推奨されている)
例題
作成するもの
DatePickerDialog, TimePickerDialog を表示するサンプルプログラムを作成します。Pickerを呼び出すには、DialogFragmentクラスを使用することが推奨されています。
やや構成が複雑なので、まずはサンプルプログラムを実行してみましょう。
レイアウト
activity_main.xml に以下のコントロールを配置します。
- Button(R.id.button_date)
- TextView(R.id.textView_date)
- Button(R.id.button_time)
- TextView(R.id.textView_time)
- Button(R.id.button_calc)(課題2で使用)
- TextView(R.id.textView_calc)(課題2で使用)
DatePickerDialogFragment, TimePickerDialogFragment は、レイアウトファイルは不要です。
プログラム
新規に「DatePickerDialogFragment.java」をテキストエディタで作成して、「MainActivity.java」と同じ場所に置いてください。
package xxxxxxxx; import android.app.DatePickerDialog; import android.app.Dialog; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.widget.DatePicker; import java.util.Calendar; public class DatePickerDialogFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Calendar calendar = Calendar.getInstance(); int iYear = calendar.get(Calendar.YEAR); int iMonth = calendar.get(Calendar.MONTH); int iDayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); return new DatePickerDialog(getActivity(), (MainActivity)getActivity(), iYear, iMonth, iDayOfMonth); } @Override public void onDateSet(DatePicker datePicker, int year, int month, int day) { // 日付が選択されたときの処理 } }
新規に「TimePickerDialogFragment.java」をテキストエディタで作成して、「MainActivity.java」と同じ場所に置いてください。
package xxxxxxxx; import android.app.Dialog; import android.app.TimePickerDialog; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.widget.TimePicker; import java.util.Calendar; public class TimePickerDialogFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener { @Override public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { final Calendar c = Calendar.getInstance(); int hour = c.get(Calendar.HOUR_OF_DAY); int minute = c.get(Calendar.MINUTE); return new TimePickerDialog(getActivity(), (Sample12MainActivity)getActivity(), hour, minute, true); } @Override public void onTimeSet(TimePicker timePicker, int hourOfDay, int minute) { // 時刻が選択されたときの処理 } }
MainActivityは、それぞれのダイアログのリスナー(DatePickerDialog.OnDateSetListener, TimePickerDialog.OnTimeSetListener)を登録しています。
public class MainActivity extends AppCompatActivity implements DatePickerDialog.OnDateSetListener, TimePickerDialog.OnTimeSetListener { public static final String TAG_DatePicker = "DatePicker"; public static final String TAG_TimePicker = "TimePicker"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button buttonDate = findViewById(R.id.button_date); buttonDate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { DatePickerDialogFragment dialog = new DatePickerDialogFragment(); dialog.show(getSupportFragmentManager(), TAG_DatePicker); } }); Button buttonTime = findViewById(R.id.button_time); buttonTime.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { TimePickerDialogFragment dialog = new TimePickerDialogFragment(); dialog.show(getSupportFragmentManager(), TAG_TimePicker); } }); } // DatePickerDialogFragment からの受け取り @Override public void onDateSet(DatePicker datePicker, int year, int month, int dayOfMonth) { // month: 0-11 int iMonth = month + 1; TextView textViewDate = findViewById(R.id.textView_date); textViewDate.setText("" + year + "/" + iMonth + "/" + dayOfMonth); } // TimePickerDialogFragment からの受け取り @Override public void onTimeSet(TimePicker timePicker, int hourOfDay, int minute) { TextView textViewTime = findViewById(R.id.textView_time); textViewTime.setText("" + hourOfDay + ":" + minute); } }
実行、確認
Buttonをクリックすると、DatePickerDialog, TimePickerDialog が表示され、OKを選択すると、選択した日付/時間がTextViewに表示されます。
課題1
プリファレンス(SharedPreferences)を使用して、以下の動作になるように、例題のサンプルプログラムを修正してください。
- DatePickerDialog, TimePickerDialog で設定した日付/時間の保存
- それぞれのTextViewに、設定した日付/時間を表示
- それぞれのダイアログを呼び出したとき、保存した日付/時間が選択されるようにする
課題2
レイアウトに Button(R.id.button_calc)と TextView(R.id.textView_calc)を追加して、Buttonをクリックすると、「現在の日付/時間」から「それぞれのダイアログで設定した日付/時間」の引き算を行い、計算結果をTextViewに表示するようにプログラムを修正してください。