2015-06-11 14 views
10

Ho cercato una soluzione per nascondere uno qualsiasi dei seguenti filatori di DatePicker. Per Android 5.0 sono state modificate le variabili interne e, nel mio caso, i filatori del giorno e del mese sono stati nuovamente visibili dopo l'aggiornamento sul mio dispositivo.Nascondere giorno, mese o anno da DatePicker in Android 5.0+ Lollipop

Android 4.4 e Kitkat soluzione

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 Soluzione

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

ho trovato la soluzione di cui sopra a questo problema qui: Custom Date Picker Dialog in Android Lollipop

volevo per essere sicuro è stato facilmente ricercabile in modo che altri potessero trarne vantaggio, così ho creato questo nuovo post. (La soluzione mi ha richiesto diverse ore per individuare e capire, quindi spero di aiutare qualcuno con questo).

Ho provato questo e funziona perfettamente. Infatti, se metti la soluzione per il Lollipop prima e poi sotto, nel codice, metti la soluzione per Kitkat, allora è compatibile per entrambe le versioni senza interferenze. (Assicurarsi di utilizzare try/catch;)

EDIT 2015/07/22: ho pensato che fosse evidente se si stava usando un DatePicker che aveva bisogno di essere inizializzato. Ho incluso il codice per mostrare che è necessario inizializzare DatePicker prima di eseguire il resto del codice (in entrambe le situazioni) altrimenti le tue viste genereranno una NullPointerException. Ciò include l'annoSpinner che lancia un null. Inoltre, dovresti avere almeno una vista per la data, non nasconderle tutte e 3, ovvero non nascondere il giorno, il mese e l'anno allo stesso tempo.

+0

In questo codice "View" sempre nullo .. – Destro

+0

Dovrete essere più specifico su quello che stai parlando ... – Brandon

+0

Ho usato il codice sopra e sto ottenendo "yearSpinner" come null. quale dovrebbe essere il problema? –

risposta

11

Solo per le ossa pigri, questo il codice completamente integrato (qualsiasi SDK) che sta lavorando per me per costruire un selettore mese (il 90% pari a @Brandon suggerimento):

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

bene, risolvi il mio problema! – sanemars

14

Molto semplice, ma non intuitivo.

Primo cambio del tema da DialogPicker

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

Ora, sì, si può nascondere qualsiasi filatore.

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

funzionano bene per me in 5.0.2 API 21

+1

provato un milione di cose questo è quello che lo ha risolto! –

Problemi correlati