Android API 21+ DatePicker не может скрывать поля

Я пытаюсь показать только поля дня месяца и месяца в DatePicker в AlertDialog. В предыдущих API из API 21 я могу сделать это с помощью кода ниже. Но когда я пытаюсь сделать это в API21 +, «getDeclaredFields ()» даже не возвращает, как поля «mYearPicker» или «mYearSpinner». Кто-нибудь знает, как Могу я просто показать поля «День» и «Месяц»? И я даже не знаю, что такое поле «116».

Мой код такой:

 final DatePicker datePickerStart = new DatePicker(new ContextThemeWrapper(getActivity(), android.R.style.Theme_Holo_Light_Dialog_NoActionBar));
    datePickerStart .setCalendarViewShown(false);
    datePickerStart .setSpinnersShown(true);
    try {
        Field f[] = datePickerStart .getClass().getDeclaredFields();
        for (Field field : f) {
            if (field.getName().equals("mYearPicker")|| field.getName().equals("mYearSpinner")) {
                field.setAccessible(true);
                Object yearPicker = new Object();
                yearPicker = field.get(datePickerStart);
                ((View) yearPicker).setVisibility(View.GONE);
            }
        }
    }
    catch (Exception e) {
        Log.e("ERROR", e.getMessage());
    }

Должно выглядеть так: До API 21

Выглядит так: API 21+

Любая идея?


person Goktug    schedule 10.05.2016    source источник
comment
Гм, а почему бы не форкнуть DatePicker и не модифицировать его по своему усмотрению? Или почему бы не использовать стороннюю библиотеку? Что заставляет вас думать, что этот подход будет работать на тысячах моделей устройств Android, учитывая, что производители устройств могут изменять внутреннее устройство Android, не говоря уже о Google с новыми версиями Android?   -  person CommonsWare    schedule 10.05.2016
comment
похоже на дубликат stackoverflow.com/questions/30789907/   -  person Morse    schedule 10.05.2016
comment
@Morse спасибо !! это сработало хорошо   -  person Goktug    schedule 10.05.2016


Ответы (1)


Благодаря @Morse я нашел решение ЗДЕСЬ

public DatePicker initMonthPicker(){
    DatePicker dp_mes = new DatePicker(new ContextThemeWrapper(getActivity(), android.R.style.Theme_Holo_Light_Dialog_NoActionBar));

    int year    = dp_mes.getYear();
    int month   = dp_mes.getMonth();
    int day     = dp_mes.getDayOfMonth();

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

        int monthSpinnerId = Resources.getSystem().getIdentifier("month", "id", "android");
        if (monthSpinnerId != 0)
        {
            View monthSpinner = dp_mes.findViewById(monthSpinnerId);
            if (monthSpinner != null)
            {
                monthSpinner.setVisibility(View.VISIBLE);
            }
        }

        int yearSpinnerId = Resources.getSystem().getIdentifier("year", "id", "android");
        if (yearSpinnerId != 0)
        {
            View yearSpinner = dp_mes.findViewById(yearSpinnerId);
            if (yearSpinner != null)
            {
                yearSpinner.setVisibility(View.GONE);
            }
        }
    } else { //Older SDK versions
        Field f[] = dp_mes.getClass().getDeclaredFields();
        for (Field field : f)
        {
            if(field.getName().equals("mDayPicker") || field.getName().equals("mDaySpinner"))
            {
                field.setAccessible(true);
                Object dayPicker = null;
                try {
                    dayPicker = field.get(dp_mes);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                ((View) dayPicker).setVisibility(View.GONE);
            }

            if(field.getName().equals("mMonthPicker") || field.getName().equals("mMonthSpinner"))
            {
                field.setAccessible(true);
                Object monthPicker = null;
                try {
                    monthPicker = field.get(dp_mes);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                ((View) monthPicker).setVisibility(View.VISIBLE);
            }

            if(field.getName().equals("mYearPicker") || field.getName().equals("mYearSpinner"))
            {
                field.setAccessible(true);
                Object yearPicker = null;
                try {
                    yearPicker = field.get(dp_mes);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                ((View) yearPicker).setVisibility(View.GONE);
            }
        }
    }
    return dp_mes;
}

Поэтому я просто вызываю этот метод, когда мне нужен новый объект DatePicker.

person Goktug    schedule 10.05.2016