Скрыть день, месяц или год от DatePicker в Android 5.0+ Lollipop

Я искал решение, чтобы скрыть любой из следующих блесен от DatePicker. Для Android 5.0 внутренние переменные были изменены, и, в моем случае, дневные и месячные счетчики снова были видны после обновления на моем устройстве.

Android 4.4 и решение Kitkat

DatePicker dpDate = (DatePicker) findViewById(R.id.dpDate);

    // Initialize Date Picker
    int year    = dpDate.getYear();
    int month   = dpDate.getMonth();
    int day     = dpDate.getDayOfMonth();
    dpDate.init(year, month, day, this);

Field f[] = dpDate.getClass().getDeclaredFields();
            for (Field field : f) 
            {
                // Hides the DAY spinner
                if(field.getName().equals("mDayPicker") || field.getName().equals("mDaySpinner")) 
                {
                    field.setAccessible(true);
                    Object dayPicker = new Object();
                    dayPicker = field.get(dpDate);
                    ((View) dayPicker).setVisibility(View.GONE);
                }

                // Hides the MONTH spinner
                if(field.getName().equals("mMonthPicker") || field.getName().equals("mMonthSpinner")) 
                {
                    field.setAccessible(true);
                    Object monthPicker = new Object();
                    monthPicker = field.get(dpDate);
                    ((View) monthPicker).setVisibility(View.GONE);
                }

                // Hides the YEAR spinner
                if(field.getName().equals("mYearPicker") || field.getName().equals("mYearSpinner")) 
                {
                    field.setAccessible(true);
                    Object yearPicker = new Object();
                    yearPicker = field.get(dpDate);
                    ((View) myearPicker).setVisibility(View.GONE);
                }
            }

Android 5.0+ Lollipop Solution

    DatePicker dpDate = (DatePicker) findViewById(R.id.dpDate);

    // Initialize Date Picker
    int year    = dpDate.getYear();
    int month   = dpDate.getMonth();
    int day     = dpDate.getDayOfMonth();
    dpDate.init(year, month, day, this);

    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
            {
                int daySpinnerId = Resources.getSystem().getIdentifier("day", "id", "android");
                if (daySpinnerId != 0) 
                {
                    View daySpinner = dpDate.findViewById(daySpinnerId);
                    if (daySpinner != null) 
                    {
                        daySpinner.setVisibility(View.GONE);
                    }
                }
            }

            if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
            {
                int monthSpinnerId = Resources.getSystem().getIdentifier("month", "id", "android");
                if (monthSpinnerId != 0) 
                {
                    View monthSpinner = dpDate.findViewById(monthSpinnerId);
                    if (monthSpinner != null) 
                    {
                        monthSpinner.setVisibility(View.GONE);
                    }
                }
            }

            if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
            {
                int yearSpinnerId = Resources.getSystem().getIdentifier("year", "id", "android");
                if (yearSpinnerId != 0) 
                {
                    View yearSpinner = dpDate.findViewById(yearSpinnerId);
                    if (yearSpinner != null) 
                    {
                        yearSpinner.setVisibility(View.GONE);
                    }
                }
            }

Я нашел вышеуказанное решение этой проблемы здесь:Пользовательский диалог выбора даты в Android Lollipop

Я хотел убедиться, что это было легко найти, чтобы другие могли извлечь из этого пользу, поэтому я создал этот новый пост. (Решение заняло у меня несколько часов, чтобы найти и понять, поэтому я надеюсь помочь кому-то в этом).

Я проверил это, и он отлично работает. Фактически, если вы сначала поместите решение для Lollipop, а затем в коде, поместите решение для Kitkat, то оно совместимо для обеих версий без помех. (Обязательно используйте try / catch;)

РЕДАКТИРОВАТЬ 7.22.2015: Я думал, что было очевидно, если кто-то использует DatePicker, что его нужно инициализировать. Я включил код, чтобы показать, что вам нужно инициализировать DatePicker до того, как вы запустите остальную часть кода (в обеих ситуациях), иначе ваши Views будут генерировать исключение NullPointerException. Это включает в себя yearSpinner, выбрасывающий ноль. Кроме того, у вас должен быть хотя бы один просмотр даты, не скрывайте все 3, т. Е. Не скрывайте день, месяц и год одновременно.

Ответы на вопрос(3)

Ваш ответ на вопрос