【问题标题】:MaterialDatePicker not working on AndroidMaterialDatePicker 无法在 Android 上运行
【发布时间】:2020-01-31 15:47:53
【问题描述】:

我想将我的项目的日期选择器更改为 Material Components for Android 提供的日期选择器,但它不起作用。

这是我尝试过的代码:

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

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

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

这就是它的样子:

它应该是这样的:

谁能告诉我遗漏了什么?

谢谢

【问题讨论】:

  • 您好,您的预期结果图片丢失,请修复它,我们会尽力帮助您。

标签: java android material-design androidx material-components-android


【解决方案1】:

我的原色是白色时遇到了同样的问题。

简单的解决方案是覆盖日历样式中的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)

【讨论】:

    【解决方案2】:

    通过Material Components for Android,您可以使用新的MaterialDatePicker

    要正常工作,您必须在您的应用中使用Material Components Theme
    通过这种方式,您可以继承选取器的样式和主题。

    要选择单个日期,只需使用:

    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
    

    【讨论】:

    • 如何为此设置主题?我的正面/负面按钮和标题、口音等显示为空白。
    • 您必须按照文档中的说明在您的应用中使用Material theme。答案中的样式是所有材质主题中的默认样式。
    • 我们如何在 XML 布局文件中而不是通过编程方式声明选择器?
    【解决方案3】:

    问题出在 colorPrimary 中。

    我的项目的默认颜色 colorPrimary 是“白色”,材质日期选择器样式使用该 colorPrimary 为按钮的背景和文本着色。由于标题文本的颜色也是白色的,所以看起来什么都没有。

    我通过将样式文件导入我的项目并对我的项目中的样式进行一些调整来解决它。

    感谢大家的回答,大家都帮我找到了问题!

    【讨论】:

    • 请分享更改。您是否将您的 primaryColor 更改为白色以外的其他内容?
    【解决方案4】:

    添加最新的依赖:

    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

    【讨论】:

    • 您可以在 Google 的 Maven 存储库中查看它。 Google's Maven Repositorycom.google.android.material > 材料 >1.1.0-alpha10
    【解决方案5】:

    为了获得您想要的输出,请确保在调用 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();
    

    【讨论】:

    • 我已经实现了最后一个库,但它仍然无法正常工作。
    • DatePickerDialog 不支持范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    相关资源
    最近更新 更多