MaterialDatePicker не работает на Android

Я хочу изменить средство выбора даты в моем проекте на средство выбора даты, предоставляемое компонентами материалов для Android, но оно не работает.

Это код, который я пробовал:

MaterialDatePicker.Builder<Long> builder = MaterialDatePicker.Builder.datePicker();

MaterialDatePicker<Long> picker = builder.build();

picker.show(getSupportFragmentManager(), picker.toString());

Вот как это выглядело:

первое изображение

Вот как это должно было выглядеть:

второе изображение

Кто-нибудь может сказать мне, чего не хватает?

Спасибо


person Carina    schedule 05.09.2019    source источник
comment
Привет, изображение ожидаемого результата отсутствует. Исправьте его, и мы сделаем все возможное, чтобы помочь вам.   -  person Dor    schedule 05.09.2019


Ответы (5)


С помощью компонентов материалов для Android вы можете использовать новый MaterialDatePicker.

Для нормальной работы в вашем приложении вы должны использовать Тема компонентов материала.
Таким образом вы наследуете стиль и тема для сборщиков.

Чтобы выбрать одну дату, просто используйте:

MaterialDatePicker.Builder<Long> builder = MaterialDatePicker.Builder.datePicker();
builder.setTitleText(R.string.your_text);
MaterialDatePicker<Long> picker = builder.build();
picker.show(getSupportFragmentManager(), picker.toString());

Чтобы выбрать диапазон дат, вы можете использовать DateRange Picker, используя:

MaterialDatePicker.Builder<Pair<Long, Long>> builder =
                    MaterialDatePicker.Builder.dateRangePicker();
CalendarConstraints.Builder constraintsBuilder = new CalendarConstraints.Builder();
builder.setCalendarConstraints(constraintsBuilder.build());
MaterialDatePicker<?> picker = builder.build();
picker.show(getSupportFragmentManager(), picker.toString());

введите описание изображения здесь

Проверьте цвета, используемые в вашей теме.

Эти атрибуты определяют ваш стиль. Вам не нужно их добавлять, они по умолчанию предоставляются с темой компонентов материала.

<!-- Picker styles and themes. -->
<item name="materialCalendarStyle">@style/Widget.MaterialComponents.MaterialCalendar</item>
<item name="materialCalendarFullscreenTheme">@style/ThemeOverlay.MaterialComponents.MaterialCalendar.Fullscreen</item>
<item name="materialCalendarTheme">@style/ThemeOverlay.MaterialComponents.MaterialCalendar</item>

На основе этого стиля сборщиком используются следующие цвета:

HeaderLaoyout     -> background:colorPrimary, textColor:colorOnPrimary
HeaderSelection   -> background:colorPrimary, textColor:colorOnPrimary
ConfirmButtons    -> background:colorPrimary, textColor:colorOnPrimary
Buttons           -> background:colorPrimary, textColor:colorOnSurface
HeaderToggleButton->                          textColor:colorOnPrimary
Day               ->                          text:colorOnSurface  stroke:colorOnSurface
SelectedDay       -> background:colorPrimary, textColor:colorOnPrimary
RangeFillColor    -> background:colorPrimary
person Gabriele Mariotti    schedule 05.09.2019
comment
как мне настроить для этого тему? Моя показывает пустые положительные / отрицательные кнопки и заголовок, акцент и т. Д. - person DaniloDeQueiroz; 14.09.2019
comment
Вы должны использовать Тема материала в вашем приложении, как описано в документе. Стили в ответе используются по умолчанию для всех тем материалов. - person Gabriele Mariotti; 14.09.2019
comment
Как мы можем объявить средство выбора в файле макета XML, а не программно? - person IgorGanapolsky; 03.01.2021

Проблема была в цвете Primary.

Цвет моего проекта по умолчанию для colorPrimary был «белым», а стиль выбора даты материала использует этот colorPrimary для окраски фона и текста кнопок. Поскольку цвет текста заголовка также был белым, похоже, что там ничего не было, когда было все.

Я решил это, импортировав файл стилей в свой проект и внося некоторые изменения в стили в моем проекте.

Всем спасибо за ответы, все помогли в поиске проблемы!

person Carina    schedule 12.09.2019
comment
Поделитесь, пожалуйста, изменениями. Вы поменяли свой primaryColor на что-то другое, кроме белого? - person Mangesh; 09.03.2020

Чтобы получить желаемый результат, обязательно добавьте это перед вызовом show():

builder.setTitleTextResId(R.string.your_text);
// Where R.string.your_text must be equal to "Selected Date" or whatever you want

В частности, для материала DatePicker вам необходимо сначала реализовать последнюю версию библиотеки.

implementation 'com.google.android.material:material:1.1.0-alpha09'

потом

  MaterialDatePicker.Builder<Long> builder = 
                        MaterialDatePicker.Builder.datePicker();
  builder.setTitleTextResId(R.string.your_text);
  MaterialDatePicker<Long> picker = builder.build();
  picker.show(getSupportFragmentManager(), picker.toString());

Вы также можете просто показать DatePickerDialog вместо использования Builder. Диалог предназначен для отображения диалога и получения выбранных данных:

EditText date;
DatePickerDialog datePickerDialog;

// Calendar object to hold the selected data
final Calendar c = Calendar.getInstance();
int mYear = c.get(Calendar.YEAR); // current year
int mMonth = c.get(Calendar.MONTH); // current month
int mDay = c.get(Calendar.DAY_OF_MONTH); // current day
// date picker dialog
datePickerDialog = new DatePickerDialog(MainActivity.this,
        new DatePickerDialog.OnDateSetListener() {

            @Override
            public void onDateSet(DatePicker view, int year,
                                  int monthOfYear, int dayOfMonth) {
                // set day of month , month and year value in the edit text
                date.setText(dayOfMonth + "/"
                        + (monthOfYear + 1) + "/" + year);

            }
        }, mYear, mMonth, mDay);
datePickerDialog.show();
person Yash Krishan    schedule 05.09.2019
comment
У меня реализована последняя библиотека, но она все еще не работает. - person Carina; 05.09.2019
comment
DatePickerDialog не поддерживает диапазоны. - person IgorGanapolsky; 03.01.2021

Добавить последнюю зависимость:

implementation 'com.google.android.material:material:1.1.0-alpha10'

MaterialDatePicker.Builder<Long> builder = MaterialDatePicker.Builder.datePicker();
       builder.setTitleTextResId(R.string.your_text);// here is the title for your datepicker
       MaterialDatePicker<Long> picker = builder.build();
       picker.show(getSupportFragmentManager(), picker.toString());

Другие варианты: https://github.com/wdullaer/MaterialDateTimePicker.

person Manoj Kumar    schedule 05.09.2019
comment
вы можете проверить это в репозитории Google Maven. репозиторий Google Maven com.google.android.material ›материал› 1.1 .0-alpha10 - person Manoj Kumar; 05.09.2019

У меня была такая же проблема, когда мой основной цвет был белым.

Простое решение - переопределить primaryColor в стиле календаря:

Базовая тема:

<style name="Base.Theme.YV.Bible" parent="Theme.MaterialComponents.DayNight.NoActionBar">
  <item name="materialCalendarStyle">@style/Theme.YV.Bible.DatePicker</item>
  <item name="android:datePickerDialogTheme">@style/Theme.YV.Bible.DatePicker</item>
</style>

Тема календаря / Datepicker

<style name="Theme.YV.Bible.DatePicker" parent="ThemeOverlay.MaterialComponents.MaterialCalendar">
  <item name="colorPrimary">?colorPrimaryDark</item> // this is the key, we need to use a dark color instead of our theme's primary color
</style>

Использование

val picker = MaterialDatePicker.Builder
    .datePicker()
    .setCalendarConstraints(CalendarConstraints.Builder().setStart(now().time).build())
    .setSelection(c.timeInMillis)
    .setTheme(com.bible.base.R.style.Theme_YV_Bible_DatePicker)
    .build()
picker.show(fragmentManager, null)
person jacoballenwood    schedule 03.06.2021