Dialogue de cliqueur de données sans visualisation de calendrier en lollipop [mode spinner]?
j'ai lu la documentation: http://developer.android.com/guide/topics/ui/controls/pickers.html mais maintenant, dans lollipop apparaît le calendrier (il est ok pour un événement, mais horrible pour fixer une date de naissance, je voudrais un spinner mode.) et je peux pas l'enlever! Dans layout, 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 à apparaissent!
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;
}
}
9 réponses
DatePickerDialog utilise le thème 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 spécifier de nouveau tous les attributs -- tels que le style Date picker -- que vous avez mis 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: Grâce à Problème 222208, cela ne fonctionnera pas dans Android N / API 24. Il a déjà été fixé dans la plate-forme pour la prochaine version. Il n'y a pas de solution de rechange Disponible pour les périphériques API 24.
appliquer le Holo_theme dans le niveau de code obtenu 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 et de l'utiliser ensuite de façon programmatique dans le code.
Si @alanv réponse est parfait et fonctionne correctement, le problème c'est qu'elle sera appliquée pour tous les sélecteurs de Date. Supposons que vous ayez un curseur de données où vous devez afficher la vue calendrier, et un autre curseur de données où vous devez afficher la vue spinner, cela ne fonctionnera pas.
Donc définir un nouveau style dans une style.XML. Créez ce fichier dans un dossier nommé valeurs-v21 (voir structure de nommage ici), puisque ces attributs sont introduits après lollipop seulement. 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, de l'utiliser dans le code comme ceci
DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(),
R.style.CustomDatePickerDialogTheme, this, year, month, day);
return datePickerDialog;
ajouter l'attribut calendarViewShown et le mettre à 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 le Vieux" spinner " style DatePicker qui est juste trois Numbererpicker mis ensemble:
https://github.com/drawers/SpinnerDatePicker
tout D'abord, 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();
Avertissement: je suis l'auteur de cette bibliothèque
Pouvez-vous essayer cette
DatePickerDialog dialogDatePicker = new DatePickerDialog(getActivity(), this, year, month, day);
dialogDatePicker.getDatePicker().setCalendarViewShown(false);
return dialogDatePicker;
supprimer
dialogDatePicker.getDatePicker().setSpinnersShown(true);
mis à part tous les trucs fantaisistes, utilisez le constructeur DatePickerDialog qui prend un paramètre "thème int". Sans lui, il semble être par défaut à n'importe quel int le met en mode CalendarView. Avec de petits nombres entiers (0, 1, 2, 3...) il vous donnera un spinner (au moins dans mon application API 19 sur un émulateur). En gros, essayez de nouveau DatePickerDialog( getContext(), 0, cette, année, mois, jour ) Notez le 0 (ou 1, ou 2, etc) là
Attention: Je ne suis pas sûr qu'il y ait une liste quelque part de thème statique et en utilisant un thème "0" au lieu de".HOLO_LIGHT " ou ce qui pourrait faire une différence sur différents appareils, mais il obtient le travail fait d'une certaine façon.
Essayez cela, il a travaillé pour moi, faire une coutume datelistener:
@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));
}
les méthodes de cliqueur de données liées à l'affichage de spinner et/ou de calendar view sont dépréciées à partir du niveau 24 de L'API. La méthode setSpinnersShown(booléen montré) et setscalendarviewshown (booléen montré) sont dépréciées parce que le style de matériau de mode de calendrier ne supporte pas la fonctionnalité.
si vous voulez utiliser le style matériel en mode spinner, utilisez le widget de cliqueur de données.
Appliquer en dessous de style à votre sélecteur de date élément xml pour obtenir du matériel spinner. Pour plus d'informations sur le ramasseur de dattes et voirhttp://www.zoftino.com/android-datepicker-example