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

Искам да сменя инструмента за избор на дата на моя проект с инструмента за избор на дата, предоставен от Material Components за 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)


С Material Components за 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());

въведете описание на изображението тук

Проверете цветовете, използвани във вашата тема.

Тези атрибути определят вашия стил. Не е необходимо да ги добавяте, те се предоставят по подразбиране с темата Material Components.

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

Проблемът беше в colorPrimary.

Цветът по подразбиране на моя проект за 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

Конкретно за Material 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
можете да го проверите в Maven Repository на Google. Хранилище Maven на Google com.google.android.material › material ›1.1 .0-алфа10 - 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>

Тема за календар/избор на дата

<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