问题
I'm using the basic DatePickerDialog tutorial by Android found here Android Date Picker
and I've got it working. But I only want to be able to pick a date from this year. So is there a way to remove the year from the Dialog so that only the month and day are displayed? Every time I try and take the Year int out it breaks the code.
回答1:
Yes it possible. DatePicker has the built-in three NumberPicker control, followed by the year, month, day, hide out first to.
final Calendar cal = Calendar.getInstance();
mDialog = new CustomerDatePickerDialog(getContext(), this,
cal.get(Calendar.YEAR), cal.get(Calendar.MONTH),
cal.get(Calendar.DAY_OF_MONTH));
mDialog.show();
DatePicker dp = findDatePicker((ViewGroup) mDialog.getWindow().getDecorView());
if (dp != null) {
((ViewGroup) dp.getChildAt(0)).getChildAt(0).setVisibility(View.GONE);
}
CustomerDatePickerDialog
class CustomerDatePickerDialog extends DatePickerDialog {
public CustomerDatePickerDialog(Context context, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth) {
super(context, callBack, year, monthOfYear, dayOfMonth);
}
@Override
public void onDateChanged(DatePicker view, int year, int month, int day) {
super.onDateChanged(view, year, month, day);
mDialog.setTitle((month + 1) + "-" + day + "-");
}
}
DatePicker:
private DatePicker findDatePicker(ViewGroup group) {
if (group != null) {
for (int i = 0, j = group.getChildCount(); i < j; i++) {
View child = group.getChildAt(i);
if (child instanceof DatePicker) {
return (DatePicker) child;
} else if (child instanceof ViewGroup) {
DatePicker result = findDatePicker((ViewGroup) child);
if (result != null)
return result;
}
}
}
return null;
}
回答2:
One liner:
getDatePicker().findViewById(Resources.getSystem().getIdentifier("year", "id", "android")).setVisibility(View.GONE);
Make sure when you build the dialog that you select a leap year (eg. 1904) to ensure February 29 is included in the calendar:
DatePickerDialog dialog = new DatePickerDialog(getContext(),
listener,
1904,
month,
dayOfMonth
);
dialog.show();
回答3:
I'm not sure if hide first child it's a good idea. I tested this solution:
- Android 2.3 -> it works (day spinner is gone)
- Android 4.0 -> it does not work because there is one more element (calendar) and first of the spinners is not a day but month.
Better solution could be modify source code of DatePicker to your own package
回答4:
I feel this is a much better implementation. Also, consider duskwuff's comment on the OP. This can make days not appear correctly.
date_picker
<?xml version="1.0" encoding="utf-8"?>
<DatePicker xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/datePickerNoYear"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
CustomDatePickerDialog.java
public class DatePickerDialogNoYear extends DatePickerDialog {
public DatePickerDialogNoYear(Context context, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth) {
super(context, callBack, year, monthOfYear, dayOfMonth);
hideYear();
}
public DatePickerDialogNoYear(Context context, int theme, OnDateSetListener listener, int year, int monthOfYear, int dayOfMonth) {
super(context, theme, listener, year, monthOfYear, dayOfMonth);
hideYear();
}
@Override
public void setView(View view, int viewSpacingLeft, int viewSpacingTop, int viewSpacingRight, int viewSpacingBottom) {
view = findViewById(R.id.datePickerNoYear);
super.setView(view, viewSpacingLeft, viewSpacingTop, viewSpacingRight, viewSpacingBottom);
}
private void hideYear() {
try {
Field f[] = this.getClass().getDeclaredFields();
for (Field field : f) {
if (field.getName().equals("mYearPicker")) {
field.setAccessible(true);
((View) field.get(this)).setVisibility(View.GONE);
}
}
} catch (SecurityException | IllegalArgumentException | IllegalAccessException e) {
Log.d("ERROR", e.getMessage());
}
}
}
Then just use it like any other DatePickerDialog. Good luck!
回答5:
In this thread you have a very simple solution (more than the previous one), I'm trying it now and works fine.
Hide Year field in Android DatePicker?
来源:https://stackoverflow.com/questions/10233760/remove-year-from-datepickerdialog