Показывать год выбора в 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
}
}