我想将项目的日期选择器更改为Android材质组件提供的日期选择器,但无法使用。
这是我尝试过的代码:
MaterialDatePicker.Builder<Long> builder = MaterialDatePicker.Builder.datePicker();
MaterialDatePicker<Long> picker = builder.build();
picker.show(getSupportFragmentManager(), picker.toString());
它是这样的:
这应该是这样的:
有人可以告诉我缺少什么吗?
谢谢
答案 0 :(得分:10)
有了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());
检查主题中使用的颜色。
这些属性定义您的样式。您不需要添加它们,它们默认情况下带有“材料成分”主题。
<!-- 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
答案 1 :(得分:1)
问题出在colorPrimary。
我的项目的默认颜色为colorPrimary的默认颜色是“白色”,并且Material Date Picker样式使用该colorPrimary为按钮的背景和文本着色。由于标题文本的颜色也是白色,所以当所有内容都显示为空白时。
我通过将样式文件导入到我的项目中并对我的项目中的样式进行了一些调整来解决它。
谢谢大家的回答,他们都帮助发现了问题!
答案 2 :(得分:0)
要获得所需的输出,请确保在调用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();
答案 3 :(得分:0)
添加最新依赖项:
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());
答案 4 :(得分:0)
我的原色是白色也有同样的问题。
简单的解决方案是覆盖日历样式中的 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)