在Android日历视图中首先显示年份选择

12 android datepicker

在Lollipop之后,DatePicker有一个非常漂亮的日历视图来选择日期.但问题是选择年份.大多数普通人在选择年份时遇到麻烦.他们只是滚动.滚动更改年份需要很长时间.因此我需要在android中打开Datepicker Dialog时首先显示年份选择.

Datepicker通常打开如下:

在此输入图像描述

但它应该从年份选择开始.如下所示:

在此输入图像描述

Mat*_*sav 24

您可以获得对年视图的引用,然后只需模拟用户单击即可打开它.

dataPicker.getTouchables().get( 0 ).performClick();
Run Code Online (Sandbox Code Playgroud)

更新:如果不清楚,我将解释每一步.您需要先拥有datePicker引用.使用datePicker引用,您可以使用getTouchables()方法获取datePicker组件.组件年份位于第一位,因此需要调用.get(0)来获取对年份的引用.之后只需模拟用户点击即可在开始时打开多年视图,而不是等待用户点击它.

  • 这是我在Android上6年来发现的最好的解决方法.真棒! (2认同)

小智 5

在@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();
    }
Run Code Online (Sandbox Code Playgroud)

然后显示对话框。


Div*_*ers 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) {
    }
}
Run Code Online (Sandbox Code Playgroud)