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 実行イメージ




























