Подтвердить что ты не робот

Скрыть поле Year в Android DatePicker?

Я использую базовый DatePicker, и я пытаюсь выяснить, как скрыть поле Year на DatePickerDialog, чтобы отображались только месяц и день. Я не возражаю, что базовый код за год все равно будет, я просто хотел бы скрыть поле Year в диалоге. Вы знаете что-то вроде:

((View) myYear).setVisibility(View.GONE);

который, как я знаю, не работает, потому что myYear - это не представление, а нечто подобное. Возможно ли это?

4b9b3361

Ответ 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);