Скрыть поле Year в Android DatePicker?
Я использую базовый DatePicker, и я пытаюсь выяснить, как скрыть поле Year на DatePickerDialog, чтобы отображались только месяц и день. Я не возражаю, что базовый код за год все равно будет, я просто хотел бы скрыть поле Year в диалоге. Вы знаете что-то вроде:
((View) myYear).setVisibility(View.GONE);
который, как я знаю, не работает, потому что myYear - это не представление, а нечто подобное. Возможно ли это?
Ответы
Ответ 1
Супер простой способ, которым я нашел для реализации DatePicker, - это вызвать его в xml:
<DatePicker
android:id="@+id/thePicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
а затем скройте любое поле, которое вы хотите (в данном случае год) в java:
picker = (DatePicker) findViewById(R.id.thePicker);
try {
Field f[] = picker.getClass().getDeclaredFields();
for (Field field : f) {
if (field.getName().equals("mYearPicker")) {
field.setAccessible(true);
Object yearPicker = new Object();
yearPicker = field.get(picker);
((View) yearPicker).setVisibility(View.GONE);
}
}
}
catch (SecurityException e) {
Log.d("ERROR", e.getMessage());
}
catch (IllegalArgumentException e) {
Log.d("ERROR", e.getMessage());
}
catch (IllegalAccessException e) {
Log.d("ERROR", e.getMessage());
}
Ответ 2
Будьте очень осторожны с этим решением. вы используете рефлексию для доступа к полю и изменения видимости. Это не сработает с Android 5.0! Google изменил реализацию TimePicker и DatePicker, и классы больше не отображают какие-либо поля appart из делегата.
Я еще не знаю решение для Android 5.0+. Я сообщу вам, как только я найду что-то интересное.
Как идея, вы можете использовать Build.VERSION.SDK_INT для проверки версии Android, а затем попытаться получить доступ к DatePickerSpinnerDelegate, используя рефлексию, и установите нужное поле.
Опять же, это не идеальное решение, поскольку Google может изменить это снова и снова...
Ответ 3
Легкий способ отключения поля Year в подборщике даты
DatePicker dp = findDatePicker((ViewGroup) dialog.getWindow().getDecorView());
if(dp != null)
{
((ViewGroup) ((ViewGroup) dp.getChildAt(0)).getChildAt(0)).getChildAt(2).setEnabled(false);
((ViewGroup) ((ViewGroup) dp.getChildAt(0)).getChildAt(0)).getChildAt(2).setAlpha(0.4f);
}
если вы хотите удалить поле year только setvisibility представления результата View.GONE, как показано ниже
dp.getChildAt(0)).getChildAt(0)).getChildAt(2).setVisibility(View.GONE)
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;
}
Я ссылался ниже на ссылку для справки
Удалить год из DatePickerDialog
Ответ 4
Вы можете установить диапазон года, используя эту функцию
datePicker.setYearRange(1950,2017);