web-dev-qa-db-fra.com

Masquer le jour, le mois ou l’année de DatePicker dans Android 5.0+ Lollipop

Je cherchais une solution pour cacher l’un des disques suivants au DatePicker. Pour Android 5.0, les variables internes ont été modifiées et, dans mon cas, les filateurs jour et mois étaient à nouveau visibles après la mise à jour de mon appareil. 

Android 4.4 et KitKat 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);

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);
                    }
                }
            }

J'ai trouvé la solution ci-dessus à ce problème ici: Dialogue de sélecteur de date personnalisé dans Android Lollipop

Je voulais m'assurer que le contenu était facilement consultable afin que d'autres puissent en bénéficier, j'ai donc créé ce nouveau poste. (La solution m'a pris plusieurs heures à localiser et à comprendre, j'espère donc aider quelqu'un avec cela).

J'ai testé cela et cela fonctionne parfaitement. En fait, si vous mettez d'abord la solution pour Lollipop, puis sous le code, placez la solution pour KitKat, elle est alors compatible pour les deux versions sans interférence. (Assurez-vous d'utiliser try/catch;)

EDIT 7.22.2015: Je pensais qu'il était évident que si on utilisait un DatePicker, il fallait l'initialiser. J'ai inclus le code pour montrer que vous devez initialiser le DatePicker avant d'exécuter le reste du code (dans les deux cas), sinon votre vue lève une exception NullPointerException. Cela inclut le yearSpinner qui lance un zéro. En outre, vous devez avoir au moins une vue pour la date, ne pas masquer les 3, c’est-à-dire ne pas masquer le jour, le mois et l’année en même temps.

12
Brandon

Juste pour les fainéants, ce code entièrement intégré (tout SDK) qui fonctionne pour moi pour construire un sélecteur de mois (égal à 90% à la suggestion de @Brandon):

public void initMonthPicker(){
    dp_mes = (DatePicker) findViewById(R.id.dp_mes);

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

    dp_mes.init(year, month, day, new DatePicker.OnDateChangedListener() {
        @Override
        public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            month_i = monthOfYear + 1;
            Log.e("selected month:", Integer.toString(month_i));
         //Add whatever you need to handle Date changes
        }
    });

    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.GONE);
            }
        }

        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);
            }
        }
    }
}
16
Carlos Borau

Très simple, mais pas intuitif.

Commencez par changer le thème de DialogPicker

new DatePickerDialog(getActivity(),Android.R.style.Theme_Holo_Dialog, this, year,month, day);

Maintenant, oui, vous pouvez cacher n'importe quelle roulette.

dialog.getDatePicker().findViewById(getResources().getIdentifier("day","id","Android")).setVisibility(View.GONE);

Travaillez bien pour moi dans 5.0.2 API 21

15

Il a différent identifiant pour 5 et 6+. J'ai géré le code suivant.

if (Android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
            int yearSpinnerId = Resources.getSystem().getIdentifier("date_picker_year", "id", "Android");
            if (yearSpinnerId != 0)
            {
                View yearSpinner = datePicker.findViewById(yearSpinnerId);
                if (yearSpinner != null)
                    yearSpinner.setVisibility(View.GONE);
            }
        }

        if(Android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
            int yearSpinnerId = Resources.getSystem().getIdentifier("date_picker_header_year", "id", "Android");
            if (yearSpinnerId != 0)
            {
                View yearSpinner = datePicker.findViewById(yearSpinnerId);
                if (yearSpinner != null)
                    yearSpinner.setVisibility(View.GONE);
            }
        }
1
abalta