私はドキュメントを読みます: http://developer.Android.com/guide/topics/ui/controls/pickers.html が、Lollipopにカレンダーが表示されます(イベントは大丈夫ですが、生年月日を設定すると、スピナーモードになります)、削除できません!レイアウトこのプロパティを使用すると簡単です。
<DatePicker
datePickerMode="spinner"...>
しかし、設定しようとするとDatePickerDialogのコードから
dialogDatePicker.getDatePicker().setSpinnersShown(true);
dialogDatePicker.getDatePicker().setCalendarViewShown(false);
これらのプロパティは機能せず、カレンダーは引き続き表示されます!
public static class MyDatePicker extends DialogFragment implements DatePickerDialog.OnDateSetListener {
int pYear;
int pDay;
int pMonth;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the current date as the default date in the picker
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 dialogDatePicker = new DatePickerDialog(getActivity(), this, year, month, day);
dialogDatePicker.getDatePicker().setSpinnersShown(true);
dialogDatePicker.getDatePicker().setCalendarViewShown(false);
return dialogDatePicker;
// Create a new instance of DatePickerDialog and return it
//return new DatePickerDialog(getActivity(), this, year, month, day);
}
public void onDateSet(DatePicker view, int year, int month, int day) {
pYear = year;
pDay = day;
pMonth = month;
}
}
DatePickerDialogは、アクティビティテーマで指定されたダイアログテーマを使用します。これは完全に指定されたテーマです。つまり、アクティビティテーマで設定した属性(日付の選択スタイルなど)を再指定する必要があります。
<style name="MyAppTheme" parent="Android:Theme.Material">
<item name="Android:dialogTheme">@style/MyDialogTheme</item>
<item name="Android:datePickerStyle">@style/MyDatePicker</item>
</style>
<style name="MyDialogTheme" parent="Android:Theme.Material.Dialog">
<item name="Android:datePickerStyle">@style/MyDatePicker</item>
</style>
<style name="MyDatePicker" parent="Android:Widget.Material.DatePicker">
<item name="Android:datePickerMode">spinner</item>
</style>
注:Issue 222208 のため、これはAndroid N/API 24.次のリリースのプラットフォームで既に修正されており、API 24デバイスで利用できる回避策はありません。
コードレベルでHolo_themeを適用してください。
new DatePickerDialog(getActivity(),Android.R.style.Theme_Holo_Dialog,this, year,month, day);
この問題の最善の解決策は、XMLファイルで新しいスタイルを定義し、コードでプログラムで使用することだと思います。
@alanv answer は完璧で正常に動作しますが、問題はすべての日付ピッカーに適用されることです。カレンダービューを表示する必要があるDatePickerと、スピナービューを表示する必要がある別のDatePickerがあるとします。これは機能しません。
したがって、styles.xmlで新しいスタイルを定義します。 values-v21という名前のフォルダーにこのファイルを作成します(命名構造 here を参照)。これらの属性はLollipop以降でのみ導入されるためです。 Lollipop以前は、スピナーモードしかありませんでした。
<style name="CustomDatePickerDialogTheme" parent="Android:Theme.Material.Light.Dialog">
<item name="Android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>
<style name="MyDatePickerStyle" parent="@Android:style/Widget.Material.DatePicker">
<item name="Android:datePickerMode">spinner</item>
</style>
そして最後に、このようなコードで使用します
DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(),
R.style.CustomDatePickerDialogTheme, this, year, month, day);
return datePickerDialog;
ライブラリを使用して、3つのNumberPickerを組み合わせた古い「スピナー」スタイルのDatePickerを作成できます。
https://github.com/drawers/SpinnerDatePicker
まず、スタイルを定義します。
<style name="NumbePickerStyle">
<item name="Android:textSize">22dp</item>
<item name="Android:textColorPrimary">@color/colorAccent</item>
<item name="Android:colorControlNormal" tools:targetApi="Lollipop">@color/colorAccent</item>
</style>
その後、
new SpinnerDatePickerDialogBuilder()
.context(MainActivity.this)
.callback(MainActivity.this)
.spinnerTheme(spinnerTheme)
.year(year)
.monthOfYear(monthOfYear)
.dayOfMonth(dayOfMonth)
.build()
.show();
免責事項:私はこのライブラリの著者です
属性calendarViewShownを追加し、falseに設定します。
<DatePicker
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:id="@+id/date_field"
Android:calendarViewShown="false"/>
スピナーやカレンダービューの表示に関連するDatePickerメソッドは、APIレベル24から廃止されました。メソッドsetSpinnersShown(boolean shown)およびsetCalendarViewShown(boolean shown)は、カレンダーモードのマテリアルスタイルがこの機能をサポートしていないため廃止されました。
スピナーモードでマテリアルスタイルを使用する場合は、DatePickerウィジェットを使用します。
以下のスタイルを日付ピッカーのxml要素に適用して、マテリアルスピナーを取得します。日付の選択とスタイルの詳細については、 http://www.zoftino.com/Android-datepicker-example を参照してください。
<style name="MyDatePickerSpinnerStyle" parent="@Android:style/Widget.Material.DatePicker">
<item name="Android:datePickerMode">spinner</item>
<item name="Android:calendarViewShown">false</item>
<item name="colorControlNormal">#d50000</item>
</style>
これを試してもらえますか
DatePickerDialog dialogDatePicker = new DatePickerDialog(getActivity(), this, year, month, day);
dialogDatePicker.getDatePicker().setCalendarViewShown(false);
return dialogDatePicker;
取り除く
dialogDatePicker.getDatePicker().setSpinnersShown(true);
すべての派手なものは別として、「int theme」パラメーターを受け取るDatePickerDialogコンストラクターを使用します。これがないと、デフォルトでCalendarViewモードに設定されているintにデフォルト設定されているようです。小さな整数(0、1、2、3 ...)では、スピナーを提供します(少なくとも、私のAPI 19アプリではエミュレーターで実行します)。基本的に、新しいDatePickerDialog(getContext()、0、this、year、month、day)を試してください
注意:静的テーマフィールドのどこかにリストがあり、「Theme.HOLO_LIGHT」の代わりにハードコードされた「0」または異なるデバイスで違いを生む可能性のあるものを使用するかどうかはわかりませんが、何らかの方法で仕事を完了します。
この答えは少しトピックから外れていますが、標準のDatePicker
を使用した代替アプローチを提供します。
2019年になりましたが、この問題は引き続き発生します。
Android:datePickerMode="spinner"
はすべてのAPIで機能しません別の観点から見ると、ウィジェットは非常に便利です問題は、すべてのAndroidユーザーが年選択セクションを開くことができることを知っているわけではないということです、年の選択を簡単にします:
これにより、一部のユーザーにとって最適なUXが作成されず、生年月日選択に苦労しています(一部のユーザーは必要な年に達するまでカレンダーをスワイプするだけです)
私は、次のいずれかを実行できる回避策になりました。
ユーザーにさまざまなソリューションがどのように見えるかについては、以下のアニメーションをご覧ください。
必要なものは次のとおりです。
DatePicker
(DatePickerDialog
またはそれを作成するDialogFragment
)を表示します。「年」を取得TextView
:
val yearTextview =dialog.findViewById<TextView>(context.resources
?.getIdentifier("Android:id/date_picker_header_year", null, null)?: -1)
例えば、あなたがそれでやりたいことをしてください:
yearTextview?.performClick()
表示後にリップル効果を表示する(設定yearTextview?.isPressed = true
一定期間)
背景などを変更します。
欠点:idが次のAPIで変更される場合-それに応じて変更する必要があります
私のために働いたこれを試して、カスタムdatelistenerをしてください:
@SuppressWarnings("deprecation")
public void setDate(View view) {
showDialog(999);
}
@SuppressWarnings("deprecation")
protected Dialog onCreateDialog(int id) {
// TODO Auto-generated method stub
if (id == 999) {
return new DatePickerDialog(this, myDateListener, year, month-1, day);
}
return null;
}
//THIS
private DatePickerDialog.OnDateSetListener myDateListener= new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker arg0, int arg1, int arg2, int arg3) {
showDate(arg1, arg2+1, arg3);
}
};
private void showDate(int year, int month, int day) {
//dateView.setText(new StringBuilder().append(day).append("-")
// .append(month).append("-").append(year));
}