Показывать год выбора в Android-календаре Android

После Lollipop DatePicker имеет очень красивый календарь, чтобы выбрать дату. Но проблема заключается в выборе года. Большинство простых людей сталкиваются с проблемой выбора года. Они просто прокручиваются. Для изменения лет требуется слишком много времени. Поэтому мне нужно сначала выбрать год, когда откроется диалоговое окно Datepicker Dialog в android.

Отпечаток даты обычно открывается, как показано ниже:

введите описание изображения здесь

Но это должно начинаться с выбора года. как показано ниже:

введите описание изображения здесь

Ответ 1

Вы можете получить ссылку на вид года, а затем просто имитировать щелчок пользователя, чтобы открыть его.

dataPicker.getTouchables().get( 0 ).performClick();

UPDATE: Если не ясно, я объясню каждый шаг. Сначала нужно иметь ссылку datePicker. С ссылкой datePicker вы можете получить компоненты datePicker с методом getTouchables(). Компонентный год на первом месте, поэтому нужно позвонить .get(0), чтобы получить ссылку на год. И после этого просто имитируйте пользовательский щелчок, чтобы открыть представление лет в начале, а не ждать, когда пользователь нажмет на него.

Ответ 2

Распространение ответа @MatejVukosav

 if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        LogUtil.LogToConsole(TAG, "Date picker select");
        datePickerDialog.getDatePicker().getTouchables().get(1).performClick();
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        LogUtil.LogToConsole(TAG, "Date picker select post lollipop");
        datePickerDialog.getDatePicker().getTouchables().get(0).performClick();
    }

а затем вы показываете диалог.

Ответ 3

Существует не очень надежный способ сделать это:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    DatePicker datePicker = (DatePicker) findViewById(R.id.test);

    openYearView(datePicker);
}

private void openYearView(DatePicker datePicker) {
    try {
        Field mDelegateField = datePicker.getClass().getDeclaredField("mDelegate");
        mDelegateField.setAccessible(true);
        Object delegate = mDelegateField.get(datePicker);
        Method setCurrentViewMethod = delegate.getClass().getDeclaredMethod("setCurrentView", int.class);
        setCurrentViewMethod.setAccessible(true);
        setCurrentViewMethod.invoke(delegate, 1);
    } catch (NoSuchFieldException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
    }
}

Ответ 4

Расширяя ответ @Giovanny Piñeros, я хотел бы предложить перебрать все сенсорные элементы и выбрать соответствующий по идентификатору, чтобы гарантировать, что будет выбран правильный вид.

int viewId = 0;
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            viewId = Resources.getSystem().getIdentifier("date_picker_year",  "id", "android");
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            viewId = Resources.getSystem().getIdentifier("date_picker_header_year",  "id", "android"); 
}

Затем, если (viewId> 0), мы можем перебрать datePickerDialog.getDatePicker(). GetTouchables() и сравнить их идентификатор с viewId.

Ответ 5

Для дальнейшего использования пользователями kotlin, основываясь на существующих ответах в этой теме.

    var viewId = 0
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        viewId = Resources.getSystem().getIdentifier("date_picker_year", "id", "android")
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        viewId = Resources.getSystem().getIdentifier("date_picker_header_year", "id", "android")
    }

    yourDatePickerDialog.show()


    for (touchable in yourDatePickerDialog.getDatePicker().getTouchables()) {
        if (touchable.id.equals(viewId))
        {
            touchable.performClick()
            break
        }

    }