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;
}
}
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.
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);
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;
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"/>
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
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
Pouvez-vous essayer ceci
DatePickerDialog dialogDatePicker = new DatePickerDialog(getActivity(), this, year, month, day);
dialogDatePicker.getDatePicker().setCalendarViewShown(false);
return dialogDatePicker;
enlever
dialogDatePicker.getDatePicker().setSpinnersShown(true);
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.
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>
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));
}
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 APID'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:
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:
Voir l'animation ci-dessous sur la façon dont différentes solutions sont perçues pour un utilisateur:
Voici ce dont vous avez besoin:
DatePicker
(DatePickerDialog
ou une DialogFragment
qui la crée).Récupérer "l'année" TextView
:
val yearTextview =dialog.findViewById<TextView>(context.resources
?.getIdentifier("Android:id/date_picker_header_year", null, null)?: -1)
Faites ce que vous voulez avec, par exemple:
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.