web-dev-qa-db-ja.com

Lollipopでカレンダーを視覚化しないDatepickerダイアログ[スピナーモード]

私はドキュメントを読みます: 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;
        }
    }
33
Evilripper

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デバイスで利用できる回避策はありません。

45
alanv

コードレベルでHolo_themeを適用してください。

new DatePickerDialog(getActivity(),Android.R.style.Theme_Holo_Dialog,this, year,month, day);
37
Nithin Raja

この問題の最善の解決策は、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;
13

ライブラリを使用して、3つのNumberPickerを組み合わせた古い「スピナー」スタイルのDatePickerを作成できます。

https://github.com/drawers/SpinnerDatePicker

spinner date picker

まず、スタイルを定義します。

<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();

免責事項:私はこのライブラリの著者です

11
David Rawson

属性calendarViewShownを追加し、falseに設定します。

<DatePicker
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:id="@+id/date_field"
Android:calendarViewShown="false"/>
9
Carlos Espinoza

スピナーやカレンダービューの表示に関連する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>
2
Arnav Rao

これを試してもらえますか

DatePickerDialog dialogDatePicker = new DatePickerDialog(getActivity(), this, year, month, day);
            dialogDatePicker.getDatePicker().setCalendarViewShown(false);
            return dialogDatePicker;

取り除く

dialogDatePicker.getDatePicker().setSpinnersShown(true);
2
Fahim

すべての派手なものは別として、「int theme」パラメーターを受け取るDatePickerDialogコンストラクターを使用します。これがないと、デフォルトでCalendarViewモードに設定されているintにデフォルト設定されているようです。小さな整数(0、1、2、3 ...)では、スピナーを提供します(少なくとも、私のAPI 19アプリではエミュレーターで実行します)。基本的に、新しいDatePickerDialog(getContext()、0、this、year、month、day)を試してください

注意:静的テーマフィールドのどこかにリストがあり、「Theme.HOLO_LIGHT」の代わりにハードコードされた「0」または異なるデバイスで違いを生む可能性のあるものを使用するかどうかはわかりませんが、何らかの方法で仕事を完了します。

2
plainOldNerd

この答えは少しトピックから外れていますが、標準のDatePickerを使用した代替アプローチを提供します。
2019年になりましたが、この問題は引き続き発生します。

  • Android:datePickerMode="spinner"はすべてのAPIで機能しません
  • このような単純なタスク(非常に素晴らしいマテリアルピッカーを備えた)にライブラリを統合することは、すべての開発者が望んでいることではありません。

別の観点から見ると、ウィジェットは非常に便利です問題は、すべてのAndroidユーザーが年選択セクションを開くことができることを知っているわけではないということです、年の選択を簡単にします:

enter image description here

これにより、一部のユーザーにとって最適なUXが作成されず、生年月日選択に苦労しています(一部のユーザーは必要な年に達するまでカレンダーをスワイプするだけです)

私は、次のいずれかを実行できる回避策になりました。

  1. DatePicker(上の画像)のユーザー年選択ビューを最初に表示し、その後彼はカレンダービューに移動します
  2. または、通常のカレンダービューを表示し、「年ボタン」を波紋で強調表示します(または別の方法で、見やすくするために年の背景を変更するなど)ボタンのように)。

ユーザーにさまざまなソリューションがどのように見えるかについては、以下のアニメーションをご覧ください。

enter image description here

必要なものは次のとおりです。

  1. DatePickerDatePickerDialogまたはそれを作成するDialogFragment)を表示します。
  2. 「年」を取得TextView

    val yearTextview =dialog.findViewById<TextView>(context.resources
    ?.getIdentifier("Android:id/date_picker_header_year", null, null)?: -1)
    
  3. 例えば、あなたがそれでやりたいことをしてください:

    • プログラムでクリックを実行して、年セクションを選択します。

    yearTextview?.performClick()

    • 表示後にリップル効果を表示する(設定yearTextview?.isPressed = true一定期間)

    • 背景などを変更します。

欠点:idが次のAPIで変更される場合-それに応じて変更する必要があります

2
Leo Droidcoder

私のために働いたこれを試して、カスタム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));
    }
1
MarcS