在棒棒糖[微调模式]中没有日历可视化的Datepicker对话框?

Evi*_*per 34 android datepicker android-5.0-lollipop

我阅读了文档:http://developer.android.com/guide/topics/ui/controls/pickers.html 但是现在在棒棒糖中出现了日历(这对于一个活动来说还可以,但是设定出生日期可怕,我将旋转模式.)我无法删除它!在布局中使用此属性很容易:

 <DatePicker
 datePickerMode="spinner"...>
Run Code Online (Sandbox Code Playgroud)

但是如果我尝试设置,则从DatePickerDialog的代码

dialogDatePicker.getDatePicker().setSpinnersShown(true);
dialogDatePicker.getDatePicker().setCalendarViewShown(false); 
Run Code Online (Sandbox Code Playgroud)

这些属性不起作用,日历继续出现!

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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

ala*_*anv 46

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>
Run Code Online (Sandbox Code Playgroud)

注意:由于问题222208,这在Android N/API 24中不起作用.它已在平台中修复以用于下一版本.API 24设备没有可用的解决方法.

  • 唯一的方法就是片段,谢谢.现在要弄清楚如何使它在api v21下面都能正常工作. (2认同)

小智 38

将Holo_theme应用于为我工作的代码级别.

new DatePickerDialog(getActivity(),android.R.style.Theme_Holo_Dialog,this, year,month, day);
Run Code Online (Sandbox Code Playgroud)

  • 它在API 24上对我没用 (5认同)
  • Great answer! android.R.style.Theme_Holo_Light_Dialog looks much better though (4认同)
  • android.R.style.Theme_Holo_Dialog现在已弃用 (3认同)

the*_*ger 13

我认为这个问题的最佳解决方案是在XML文件中定义一个新样式,然后在代码中以编程方式使用它.

尽管@alanv的答案是完美的并且能够正常工作,但问题在于它将适用于所有日期选择器.假设您有一个需要显示日历视图的DatePicker,以及需要显示微调视图的另一个DatePicker,这将不起作用.

因此,在styles.xml中定义一个新样式.在名为values-v21的文件夹中创建此文件(请参阅此处的命名结构),因为这些属性仅在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>
Run Code Online (Sandbox Code Playgroud)

最后,在这样的代码中使用它

DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(),
    R.style.CustomDatePickerDialogTheme, this, year, month, day);
return datePickerDialog;
Run Code Online (Sandbox Code Playgroud)


Dav*_*son 12

您可以使用库来创建旧的"微调器"样式DatePicker,它只是三个NumberPicker放在一起:

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>
Run Code Online (Sandbox Code Playgroud)

然后,

new SpinnerDatePickerDialogBuilder()
        .context(MainActivity.this)
        .callback(MainActivity.this)
        .spinnerTheme(spinnerTheme)
        .year(year)
        .monthOfYear(monthOfYear)
        .dayOfMonth(dayOfMonth)
        .build()
        .show();
Run Code Online (Sandbox Code Playgroud)

免责声明:我是这个图书馆的作者


小智 9

添加属性calendarViewShown并将其设置为false:

<DatePicker
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/date_field"
android:calendarViewShown="false"/>
Run Code Online (Sandbox Code Playgroud)


Leo*_*der 5

这个答案有点离题,但提供了一种DatePicker对某人有用的标准替代方法。
现在是 2019 年,这个问题仍然存在。

  • android:datePickerMode="spinner" 不适用于所有 API
  • 为这样一个简单的任务(具有非常好的材料选择器)集成一个库并不是每个开发人员都想要的。

换个角度来说,这个widget还是挺方便的,问题是不是所有的安卓用户都知道可以打开年份选择部分,这使得年份选择变得容易:

在此处输入图片说明

这对某些用户来说并不是最好的用户体验,并且他们在选择出生日期时遇到困难(有些用户只是滑动日历直到到达所需的年份)

我最终得到了一个解决方案,可以执行以下操作之一:

  1. 最初显示DatePicker 的用户年份选择视图(上图),之后他导航到日历视图
  2. 或者显示常规日历视图,用波纹突出显示“年份按钮”(或以其他方式,例如年份的背景更改使其看起来像一个按钮)。

请参阅下面的动画,了解如何为用户看到不同的解决方案:

在此处输入图片说明

这是您需要的:

  1. 显示 a DatePicker(DatePickerDialogDialogFragment创建它的 a )。
  2. 检索“年” TextView

    val yearTextview =dialog.findViewById<TextView>(context.resources
    ?.getIdentifier("android:id/date_picker_header_year", null, null)?: -1)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 用它做任何你想做的事,例如:

    • 以编程方式执行单击以选择年份部分:

    yearTextview?.performClick()

    • 显示后显示涟漪效果(设置 yearTextview?.isPressed = true一段时间)

    • 改变它的背景等。

缺点:如果 id 将在下一个 API 中更改 - 它需要您相应地更改它

  • 这是一个很好的方法,并不完全符合OP想要的,但也许是最好的整体解决方案。 (2认同)

Fah*_*him 2

你能试试这个吗

DatePickerDialog dialogDatePicker = new DatePickerDialog(getActivity(), this, year, month, day);
            dialogDatePicker.getDatePicker().setCalendarViewShown(false);
            return dialogDatePicker;
Run Code Online (Sandbox Code Playgroud)

去除

dialogDatePicker.getDatePicker().setSpinnersShown(true);
Run Code Online (Sandbox Code Playgroud)

  • 这些调用现已被弃用 (4认同)