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