Android 5.1(API 22) で DatePicker ダイアログを使用するには、テーマにスタイルを設定する必要があります。何もしないで呼び出すと、大きなカレンダーが表示されて変更できません。DatePickerDialog のコンストラクタで定義したスタイル指定する方法もありますが、テーマに全て設定するほうが簡単です。
<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <!-- コントロール用 --> <item name="android:datePickerStyle">@style/MyDatePicker</item> <!-- ダイアログ用 --> <item name="android:dialogTheme">@style/MyDialogTheme</item> </style> <!-- コントロール用 --> <style name="MyDatePicker" parent="android:Widget.Material.DatePicker"> <item name="android:datePickerMode">spinner</item> </style> <!-- ダイアログ用 --> <style name="MyDialogTheme" parent="android:Theme.Material.Light.Dialog"> <item name="android:datePickerStyle">@style/MyDatePicker</item> </style> </resources>
しかし、この追加されたスタイルは、コントロールもダイアログも Android 4.4(API 19) では使用できないので Android 4.4(API 19) でテストする時はコメントにする必要があります。 実行処理
package lightbox.june.datepickercontrol; import android.app.DatePickerDialog; import android.app.Dialog; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.DatePicker; import java.util.Calendar; public class MainActivity extends AppCompatActivity { private Calendar calendar; private int year; private int monthOfYear; private int dayOfMonth; private DatePicker dp; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dp = (DatePicker) MainActivity.this.findViewById(R.id.datePicker); // ******************************** // 今日の日付 // ******************************** calendar = Calendar.getInstance(); year = calendar.get(Calendar.YEAR); monthOfYear = calendar.get(Calendar.MONTH); dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); // ****************************** // ボタン1 // Spinner // ****************************** MainActivity.this.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // ******************************** // Spinner DatePicker ダイアログの処理 // ******************************** DatePickerDialog spinnerDatePicker; spinnerDatePicker = new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { Log.i("lightbox", String.format("%d-%d-%d",year,(monthOfYear+1),dayOfMonth ) ); } }, year, monthOfYear, dayOfMonth); // 表示前に日付を設定する時の日付の変更方法 spinnerDatePicker.getDatePicker().updateDate(year, monthOfYear, dayOfMonth); spinnerDatePicker.show(); // ******************************** // Spinner DatePicker コントロールの処理 // ******************************** dp.setSpinnersShown(true); dp.setCalendarViewShown(false); Log.i("lightbox", String.format("%d/%d/%d", dp.getYear(),(dp.getMonth()+1),dp.getDayOfMonth() ) ); } }); // ****************************** // ボタン2 // CalendarView // ****************************** MainActivity.this.findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // ******************************** // CalendarView DatePicker ダイアログの処理 // ******************************** DatePickerDialog CalendarView; CalendarView = new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { Log.i("lightbox", String.format("%d-%d-%d",year,(monthOfYear+1),dayOfMonth ) ); } }, year, monthOfYear, dayOfMonth); // 表示前に日付を設定 // 表示前に日付を設定する時の日付の変更方法 CalendarView.getDatePicker().updateDate(year, monthOfYear, dayOfMonth); // 表示方法の変更 CalendarView.getDatePicker().setSpinnersShown(false); CalendarView.getDatePicker().setCalendarViewShown(true); CalendarView.show(); // ******************************** // CalendarView DatePicker コントロールの処理 // ******************************** dp.setSpinnersShown(false); dp.setCalendarViewShown(true); Log.i("lightbox", String.format("%d/%d/%d", dp.getYear(),(dp.getMonth()+1),dp.getDayOfMonth() ) ); } }); // ****************************** // ボタン3 // Spinner DialogFragment // Spinner + CalendarView // ****************************** MainActivity.this.findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // ******************************** // ダイアログ・フラグメント // ******************************** DialogFragment newFragment = new DatePickerFragment(); newFragment.show(getSupportFragmentManager(), "datePicker"); // ******************************** // Spinner + CalendarView // DatePicker コントロールの処理 // ******************************** DatePicker dp = (DatePicker) MainActivity.this.findViewById(R.id.datePicker); dp.setSpinnersShown(true); dp.setCalendarViewShown(true); Log.i("lightbox", String.format("%d/%d/%d", dp.getYear(),(dp.getMonth()+1),dp.getDayOfMonth() ) ); } }); } // ****************************** // DialogFragment // ****************************** public static class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // 初期値を DatePicker コントロールより取得 DatePicker dp = (DatePicker) DatePickerFragment.this.getActivity().findViewById(R.id.datePicker); int year = dp.getYear(); int month = dp.getMonth(); int day = dp.getDayOfMonth(); return new DatePickerDialog(getActivity(), this, year, month, day); } public void onDateSet(DatePicker view, int year, int month, int day) { Log.i("lightbox", String.format("%d-%d-%d",year,(month+1),day ) ); } } }
3つ目のボタンでは、DialogFragment を使用しており、初期値として DatePicker コントロールの値を使用しています。 Android Deveroper : DialogFragment for a date picker ※ 全てのソースコード
|
【Androidの最新記事】
- Android Studio : LiveDoor のお天気情報をリストビューに表示する手順
- Android のメニュー項目を条件が満たされた時のみ利用可能にする / onPrepareOptionsMenu
- Android Studio : LiveDoor のお天気情報をリストビューに表示した後、第二画面で name を変更して第一画面で再表示する手順
- Android の教科書到着しました。
- Android Studio をちょっと古い PC で使うと エミュレータが実行されなかった。
- Android Studio で、Failed to find target with hash string というエラーが出たら、Module の build.gradle を変更します
- Android Studio で Fragment の tools:layout で画面を指定して MainActivity には処理を書かないアプリケーション
- Android の SeekBar を縦方向で使用する設定
- Android 5.1(API 22) と Android 4.4(API 19) でのそれぞれの DatePicker コントロールの扱い
- Android Studio でプロジェクトを読み込むと、Error : C:\Users\User\.gradle\caches... と表示されて gradle の処理が出来なくなる場合の対処
- Android Studio 1.4.1 : Android 純正 Data Binding テンプレート
- Android アプリ作成の基礎 : PDF で問題
- Android Chrome の 謎の(?) 241文字仕様 / 241文字以上のコンテンツは文字が大きく表示される
- Android Studio : 行の途中で改行した時のインデント数を 1 にする
- Android Studio : キャラクタセット
- Android Studio : 起動時にプロジェクトを読み込まない設定
- Android Studio の SDK ヘのパスの変更
- armeabi-v7a しか動かない、ちょっと古い PC で、どーしてもエミュレータが起動しなくてやった事( 動いた、万歳 )
- Android 5.1 + Pleiades( Luna ) + ADT Plugin
- Android 5.1 エミュレータ + Android Studio 1.1.0 実行イメージ