web-dev-qa-db-fra.com

Boîte de dialogue Datepicker sans visualisation du calendrier dans Lollipop [mode spinner]?

J'ai lu la documentation: http://developer.Android.com/guide/topics/ui/controls/pickers.html Mais maintenant, dans Lollipop, le calendrier apparaît (c'est correct pour un événement mais définir une date de naissance, je voudrais un mode spinner.) et je ne peux pas l'enlever! Dans la mise en page C'est facile avec cette propriété: 

 <DatePicker
 datePickerMode="spinner"...>

mais à partir du code du DatePickerDialog si j'essaie de définir

dialogDatePicker.getDatePicker().setSpinnersShown(true);
dialogDatePicker.getDatePicker().setCalendarViewShown(false); 

Ces propriétés ne fonctionnent pas et le calendrier continue à apparaître!

public static class MyDatePicker extends DialogFragment implements DatePickerDialog.OnDateSetListener {
        int pYear;
        int pDay;
        int pMonth;

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            // Use the current date as the default date in the picker
            final Calendar c = Calendar.getInstance();
            int year = c.get(Calendar.YEAR);
            int month = c.get(Calendar.MONTH);
            int day = c.get(Calendar.DAY_OF_MONTH);
            DatePickerDialog dialogDatePicker = new DatePickerDialog(getActivity(), this, year, month, day);
            dialogDatePicker.getDatePicker().setSpinnersShown(true);
            dialogDatePicker.getDatePicker().setCalendarViewShown(false);
            return dialogDatePicker;
            // Create a new instance of DatePickerDialog and return it
            //return new DatePickerDialog(getActivity(), this, year, month, day);
        }

        public void onDateSet(DatePicker view, int year, int month, int day) {
            pYear = year;
            pDay = day;
            pMonth = month;
        }
    }
33
Evilripper

DatePickerDialog utilise le thème de la boîte de dialogue spécifié par votre thème d'activité. Il s'agit d'un thème entièrement spécifié, ce qui signifie que vous devez redéfinir tous les attributs, tels que le style du sélecteur de date, que vous avez définis dans votre thème d'activité.

<style name="MyAppTheme" parent="Android:Theme.Material">
    <item name="Android:dialogTheme">@style/MyDialogTheme</item>
    <item name="Android:datePickerStyle">@style/MyDatePicker</item>
</style>

<style name="MyDialogTheme" parent="Android:Theme.Material.Dialog">
    <item name="Android:datePickerStyle">@style/MyDatePicker</item>
</style>

<style name="MyDatePicker" parent="Android:Widget.Material.DatePicker">
    <item name="Android:datePickerMode">spinner</item>
</style>

Remarque: En raison de Problème 222208 , cela ne fonctionnera pas sous Android N/API 24. Il a déjà été corrigé sur la plateforme pour la prochaine version. Aucune solution de contournement n'est disponible pour les périphériques API 24.

45
alanv

Appliquer le Holo_theme dans le niveau de code a travaillé pour moi.

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

Je pense que la meilleure solution à ce problème est de définir un nouveau style dans le fichier XML, puis de l’utiliser par programme dans le code.

Bien que @alanv answer soit parfait et fonctionne correctement, le problème est qu’il sera appliqué à tous les sélecteurs de dates. Supposons que vous ayez un DatePicker pour lequel vous devez afficher la vue Calendrier et un autre DatePicker pour lequel vous devez afficher une vue spéciale, cela ne fonctionnera pas. 

Définissez donc un nouveau style dans styles.xml. Créez ce fichier dans un dossier nommé values-v21 (voir Structure de dénomination ici ), car ces attributs sont introduits après Lollipop uniquement. Avant Lollipop, il n'y avait que le mode spinner.

 <style name="CustomDatePickerDialogTheme" parent="Android:Theme.Material.Light.Dialog">
    <item name="Android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>

<style name="MyDatePickerStyle" parent="@Android:style/Widget.Material.DatePicker">
    <item name="Android:datePickerMode">spinner</item>
</style>

Et enfin, utilisez-le dans le code comme ceci

DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(),
    R.style.CustomDatePickerDialogTheme, this, year, month, day);
return datePickerDialog;
12
thedarkpassenger

Ajoutez l'attribut calendarViewShown et définissez-le sur false:

<DatePicker
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:id="@+id/date_field"
Android:calendarViewShown="false"/>
9
Carlos Espinoza

Vous pouvez utiliser une bibliothèque pour créer l'ancien DatePicker de style "spinner", constitué de trois NumberPickers assemblés:

https://github.com/drawers/SpinnerDatePicker

 spinner date picker

Premièrement, définissez un style:

<style name="NumbePickerStyle">
    <item name="Android:textSize">22dp</item>
    <item name="Android:textColorPrimary">@color/colorAccent</item>
    <item name="Android:colorControlNormal" tools:targetApi="Lollipop">@color/colorAccent</item>
</style>

Ensuite, 

new SpinnerDatePickerDialogBuilder()
        .context(MainActivity.this)
        .callback(MainActivity.this)
        .spinnerTheme(spinnerTheme)
        .year(year)
        .monthOfYear(monthOfYear)
        .dayOfMonth(dayOfMonth)
        .build()
        .show();

Disclaimer: Je suis l'auteur de cette bibliothèque

8
David Rawson

Pouvez-vous essayer ceci

DatePickerDialog dialogDatePicker = new DatePickerDialog(getActivity(), this, year, month, day);
            dialogDatePicker.getDatePicker().setCalendarViewShown(false);
            return dialogDatePicker;

enlever 

dialogDatePicker.getDatePicker().setSpinnersShown(true);
2
Fahim

Utilisez le constructeur DatePickerDialog qui prend un paramètre "int theme" . Sans celui-ci, il semblerait que le paramètre par défaut soit celui qui le définit en mode CalendarView . Avec de petits entiers (0, 1, 2, 3 ...) il vous donnera un spinner (au moins dans mon application API 19 exécutée sur un émulateur) . Essentiellement, essayez New DatePickerDialog (getContext (), 0, this, year, month, day ) Notez le 0 (ou 1, ou 2, etc.) à cet endroit

Attention: Je ne suis pas sûr s'il existe une liste de champs de thème statiques, et d'utiliser un "0" codé en dur au lieu de "Theme.HOLO_LIGHT" ou quoi que ce soit qui puisse faire la différence sur différents appareils, mais le travail est fait en quelque sorte.

2
plainOldNerd

Les méthodes DatePicker associées à l'affichage de la vue spinner et/ou du calendrier sont obsolètes à partir du niveau 24. Les méthodes setSpinnersShown (booléen affiché) et setCalendarViewShown (booléen illustré) sont déconseillées car le style de matériau en mode calendrier ne prend pas en charge la fonctionnalité.

Si vous souhaitez utiliser le style de matériau en mode rotation, utilisez le widget DatePicker.

Appliquez ci-dessous le style correspondant à l’élément xml de votre sélecteur de date afin d’obtenir un résultat optimal. Pour plus d'informations sur le sélecteur de date et les styles, voir http://www.zoftino.com/Android-datepicker-example .

<style name="MyDatePickerSpinnerStyle" parent="@Android:style/Widget.Material.DatePicker">
    <item name="Android:datePickerMode">spinner</item>
    <item name="Android:calendarViewShown">false</item>
    <item name="colorControlNormal">#d50000</item>
</style>
1
Arnav Rao

Essayez ceci a fonctionné pour moi, créez un datelistener personnalisé:

    @SuppressWarnings("deprecation")
    public void setDate(View view) {
        showDialog(999);
    }

    @SuppressWarnings("deprecation")
    protected Dialog onCreateDialog(int id) {
        // TODO Auto-generated method stub
        if (id == 999) {
            return new DatePickerDialog(this, myDateListener, year, month-1, day);
        }
        return null;
    }
    //THIS
    private DatePickerDialog.OnDateSetListener myDateListener= new DatePickerDialog.OnDateSetListener() {

        @Override
        public void onDateSet(DatePicker arg0, int arg1, int arg2, int arg3) {

            showDate(arg1, arg2+1, arg3);
        }
    };

    private void showDate(int year, int month, int day) {

        //dateView.setText(new StringBuilder().append(day).append("-")
               // .append(month).append("-").append(year));
    }
1
MarcS

Cette réponse est un peu hors sujet, mais fournit une approche alternative avec la variable standard DatePicker qui peut être utile à quelqu'un.
Nous sommes en 2019 et le problème persiste.

  • Android:datePickerMode="spinner" ne fonctionne pas du tout les API
  • Intégrer une bibliothèque pour une tâche aussi simple (avoir un assez bon sélecteur de matériel) n’est pas ce que tout développeur souhaite.

D'un autre point de vue, le widget est assez pratique, le problème est que tous les utilisateurs d'Android ne savent pas qu'ils peuvent ouvrir la section de sélection d'année, ce qui facilite la sélection d'année:

 enter image description here

Cela ne crée pas la meilleure expérience utilisateur pour certains utilisateurs et ils ont des difficultés avec la sélection de la date de naissance (certains utilisateurs glissent simplement le calendrier jusqu'à atteindre l'année requise)

J'ai fini avec une solution de contournement qui permet d'effectuer l'une des opérations suivantes:

  1. Affiche initialement la vue de sélection d’année utilisateur du DatePicker (image ci-dessus), après quoi il accède à la vue calendrier
  2. Ou montrez une vue régulière du calendrier, en mettant en surbrillance le "bouton Année" avec l'ondulation (ou d'une autre manière, telle que le changement de fond de l'année pour le faire ressembler à un bouton). 

Voir l'animation ci-dessous sur la façon dont différentes solutions sont perçues pour un utilisateur: 

 enter image description here

Voici ce dont vous avez besoin:

  1. Affiche une DatePicker (DatePickerDialog ou une DialogFragment qui la crée).
  2. Récupérer "l'année" TextView:

    val yearTextview =dialog.findViewById<TextView>(context.resources
    ?.getIdentifier("Android:id/date_picker_header_year", null, null)?: -1)
    
  3. Faites ce que vous voulez avec, par exemple:

    • Effectuez un clic par programme pour sélectionner une section d'année:

    yearTextview? .performClick ()

    • Afficher un effet d'entraînement après l'affichage (avec le paramètre yearTextview?.isPressed = true pour une certaine période)

    • Changer c'est le fond etc.

Inconvénient: si l'id est modifié dans les prochaines API, vous devrez le modifier en conséquence.

0
Leo Droidcoder