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

时间:2016-07-20 09:15:13

标签: android datepicker

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

Datepicker通常会像下面一样打开:

enter image description here

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

enter image description here

7 个答案:

答案 0 :(得分:20)

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

myText.text = "level2"

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

答案 1 :(得分: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) {
    }
}

答案 2 :(得分:3)

扩展@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 :(得分:0)

扩展@GiovannyPiñeros的答案我想建议遍历所有可触摸对象并通过id选择相应的对象,以确保将选择正确的视图。

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()并将其ID与viewId进行比较。

答案 4 :(得分:0)

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
        }

    }

答案 5 :(得分:0)

我正在使用react-native,并且DateTimePicker组件具有display =“ spinner”选项。在这种情况下,日历的渲染如下图所示。

enter image description here

答案 6 :(得分:0)

您可以通过在对话框之前仅添加一行来实现。show()

    editext.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            calendar=Calendar.getInstance();
            int day=calendar.get(Calendar.DAY_OF_MONTH);
            int month=calendar.get(Calendar.MONTH);
            int year=calendar.get(Calendar.YEAR);
            calendar.add(Calendar.DAY_OF_YEAR, 1);
            datePickerDialog=new DatePickerDialog(ActivityDoctorDetails.this, R.style.DialogTheme, new DatePickerDialog.OnDateSetListener() {
                @Override
                public void onDateSet(DatePicker datePicker, int m_year, int m_month, int m_day) {
                    String Mday, Mmonth, Myear;

                    Mday=Integer.toString(m_day);
                    Mmonth=Integer.toString(m_month);

                    if (m_day < 10) {
                        // editTextDate.setText("0"+m_day+"/"+m_month+"/"+m_year);
                        Mday="0" + Integer.toString(m_day);
                    }
                    if (m_month < 10) {
                        //editTextDate.setText(m_day+"/"+"0"+m_month+"/"+m_year);
                        Mmonth="0" + Integer.toString(m_month);

                    }
                    if (m_day < 10 && m_month < 10) {
                        //editTextDate.setText("0" + m_day + "/" + "0" + m_month + "/" + m_year);
                        Mday="0" + Integer.toString(m_day);
                        Mmonth="0" + Integer.toString(m_month);


                    }
                    if (m_day > 10 && m_month < 10) {
                        //editTextDate.setText(m_day+"/"+"0"+m_month+"/"+m_year);
                        Mmonth="0" + Integer.toString(m_month);
                        Mday=Integer.toString(m_day);


                    }
                    if (m_day < 10 && m_month > 10) {
                        //editTextDate.setText(m_day+"/"+"0"+m_month+"/"+m_year);
                        Mday="0" + Integer.toString(m_day);
                        Mmonth=Integer.toString(m_month);

                    }

                    editext.setText(m_year + "/" + Mmonth + "/" + Mday);


                }
            }, day, month, year);
            //datePickerDialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000);
            datePickerDialog.getDatePicker().getTouchables().get(0).performClick();
            datePickerDialog.show();
        }