Скрыть день, месяц или год от DatePicker в Android 5.0+ Lollipop
Я искал решение, чтобы скрыть любой из следующих блесен от DatePicker. Для Android 5.0 внутренние переменные были изменены, и, в моем случае, дневные и месячные счетчики снова были видны после обновления на моем устройстве.
Android 4.4 и решение Kitkat
DatePicker dpDate = (DatePicker) findViewById(R.id.dpDate);
// Initialize Date Picker
int year = dpDate.getYear();
int month = dpDate.getMonth();
int day = dpDate.getDayOfMonth();
dpDate.init(year, month, day, this);
Field f[] = dpDate.getClass().getDeclaredFields();
for (Field field : f)
{
// Hides the DAY spinner
if(field.getName().equals("mDayPicker") || field.getName().equals("mDaySpinner"))
{
field.setAccessible(true);
Object dayPicker = new Object();
dayPicker = field.get(dpDate);
((View) dayPicker).setVisibility(View.GONE);
}
// Hides the MONTH spinner
if(field.getName().equals("mMonthPicker") || field.getName().equals("mMonthSpinner"))
{
field.setAccessible(true);
Object monthPicker = new Object();
monthPicker = field.get(dpDate);
((View) monthPicker).setVisibility(View.GONE);
}
// Hides the YEAR spinner
if(field.getName().equals("mYearPicker") || field.getName().equals("mYearSpinner"))
{
field.setAccessible(true);
Object yearPicker = new Object();
yearPicker = field.get(dpDate);
((View) myearPicker).setVisibility(View.GONE);
}
}
Android 5.0+ Lollipop Solution
DatePicker dpDate = (DatePicker) findViewById(R.id.dpDate);
// Initialize Date Picker
int year = dpDate.getYear();
int month = dpDate.getMonth();
int day = dpDate.getDayOfMonth();
dpDate.init(year, month, day, this);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
{
int daySpinnerId = Resources.getSystem().getIdentifier("day", "id", "android");
if (daySpinnerId != 0)
{
View daySpinner = dpDate.findViewById(daySpinnerId);
if (daySpinner != null)
{
daySpinner.setVisibility(View.GONE);
}
}
}
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
{
int monthSpinnerId = Resources.getSystem().getIdentifier("month", "id", "android");
if (monthSpinnerId != 0)
{
View monthSpinner = dpDate.findViewById(monthSpinnerId);
if (monthSpinner != null)
{
monthSpinner.setVisibility(View.GONE);
}
}
}
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
{
int yearSpinnerId = Resources.getSystem().getIdentifier("year", "id", "android");
if (yearSpinnerId != 0)
{
View yearSpinner = dpDate.findViewById(yearSpinnerId);
if (yearSpinner != null)
{
yearSpinner.setVisibility(View.GONE);
}
}
}
Я нашел вышеуказанное решение этой проблемы здесь:Пользовательский диалог выбора даты в Android Lollipop
Я хотел убедиться, что это было легко найти, чтобы другие могли извлечь из этого пользу, поэтому я создал этот новый пост. (Решение заняло у меня несколько часов, чтобы найти и понять, поэтому я надеюсь помочь кому-то в этом).
Я проверил это, и он отлично работает. Фактически, если вы сначала поместите решение для Lollipop, а затем в коде, поместите решение для Kitkat, то оно совместимо для обеих версий без помех. (Обязательно используйте try / catch;)
РЕДАКТИРОВАТЬ 7.22.2015: Я думал, что было очевидно, если кто-то использует DatePicker, что его нужно инициализировать. Я включил код, чтобы показать, что вам нужно инициализировать DatePicker до того, как вы запустите остальную часть кода (в обеих ситуациях), иначе ваши Views будут генерировать исключение NullPointerException. Это включает в себя yearSpinner, выбрасывающий ноль. Кроме того, у вас должен быть хотя бы один просмотр даты, не скрывайте все 3, т. Е. Не скрывайте день, месяц и год одновременно.