Подтвердить что ты не робот

Диалоговое окно Datepicker без визуализации календаря в режиме lollipop [spinner mode]?

Я прочитал документацию: http://developer.android.com/guide/topics/ui/controls/pickers.html но теперь в леденец появляется календарь (это нормально для события, но ужасно для установки даты рождения, я бы использовал режим spinner), и я не могу его удалить! В макете Это легко с этим свойством:

 <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;
        }
    }
4b9b3361

Ответ 1

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 не существует обходного пути.

Ответ 2

Примените Holo_theme на уровне кода, который работал у меня.

new DatePickerDialog(getActivity(),android.R.style.Theme_Holo_Dialog,this, year,month, day);

Ответ 3

Добавьте атрибут calendarViewShown и установите для него значение false:

<DatePicker
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/date_field"
android:calendarViewShown="false"/>

Ответ 4

Я думаю, что лучшим решением этой проблемы является определение нового стиля в файле XML, а затем его программное использование в коде.

Несмотря на то, что @alanv answer идеально подходит и будет работать правильно, проблема заключается в том, что он будет применяться ко всем сборщикам даты. Предположим, у вас есть один DatePicker, где вам нужно показать представление календаря, а еще один DatePicker, где вам нужно показать представление Spinner, это не сработает.

Итак, определите новый стиль в файле styles.xml. Создайте этот файл в папке с именем values-v21 (см. Структуру имен здесь), поскольку эти атрибуты вводятся только после леденца. Перед леденец был только режим spinner.

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

Ответ 5

Можете ли вы попробовать это

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

удаление

dialogDatePicker.getDatePicker().setSpinnersShown(true);

Ответ 6

Все фантазии в стороне, используйте конструктор DatePickerDialog, который принимает параметр "int theme". Без него он, по-видимому, по умолчанию не зависит от того, какой int устанавливает его в режим CalendarView. С небольшими целыми числами (0, 1, 2, 3...) он даст вам счетчик (по крайней мере, в моем приложении API 19, запущенном на эмуляторе). В принципе, попробуйте новый DatePickerDialog (getContext(), 0, это, год, месяц, день) Обратите внимание на 0 (или 1, или 2 и т.д.) Там

Внимание: Я не уверен, есть ли список где-то из статических полей темы и с использованием жесткого кода "0" вместо "Theme.HOLO_LIGHT" или что-то другое, что может повлиять на разные устройства, но оно каким-то образом выполняется.

Ответ 7

Попробуй, это сработало для меня, сделай пользовательский 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));
    }

Ответ 8

Вы можете использовать библиотеку для создания старого "прядильного" стиля 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>

Тогда

new SpinnerDatePickerDialogBuilder()
        .context(MainActivity.this)
        .callback(MainActivity.this)
        .spinnerTheme(spinnerTheme)
        .year(year)
        .monthOfYear(monthOfYear)
        .dayOfMonth(dayOfMonth)
        .build()
        .show();

Отказ от ответственности: я являюсь автором этой библиотеки

Ответ 9

Методы DatePicker, связанные с отображением отображения счетчика и/или календаря, устарели от уровня API 24. Метод setSpinnersShown (показанный логический) и setCalendarViewShown (показанные булевыми) устарели, поскольку стиль материала в режиме календаря не поддерживает эту функцию.

Если вы хотите использовать стиль материала в режиме spinner, используйте виджет 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>