2012-05-01 4 views
13

Sto usando un DatePicker di base e sto cercando di capire come nascondere il campo Anno su DatePickerDialog in modo che siano visibili solo il mese e il giorno. Non mi dispiace che il codice sottostante per l'anno sarebbe ancora lì, vorrei solo nascondere il campo Anno nella finestra di dialogo. Sai con qualcosa come:Nascondi il campo Anno in Android DatePicker?

((View) myYear).setVisibility(View.GONE); 

che so non funziona perché è un myYear non int a vista, ma qualcosa del genere. È possibile?

+0

http://code.google.com/p/android-wheel/ vedere questo link. ti aiuterà ... – MAC

risposta

22

un modo super semplice che ho trovato per implementare un DatePicker è quello di chiamare in xml:

<DatePicker 
    android:id="@+id/thePicker" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"/> 

e poi nascondere a seconda di quale campo si vuole (in questo caso l'anno) in java:

picker = (DatePicker) findViewById(R.id.thePicker); 
    try { 
     Field f[] = picker.getClass().getDeclaredFields(); 
     for (Field field : f) { 
      if (field.getName().equals("mYearPicker")) { 
       field.setAccessible(true); 
       Object yearPicker = new Object(); 
       yearPicker = field.get(picker); 
       ((View) yearPicker).setVisibility(View.GONE); 
      } 
     } 
    } 
    catch (SecurityException e) { 
     Log.d("ERROR", e.getMessage()); 
    } 
    catch (IllegalArgumentException e) { 
     Log.d("ERROR", e.getMessage()); 
    } 
    catch (IllegalAccessException e) { 
     Log.d("ERROR", e.getMessage()); 
    } 
+12

Puoi sostituire 'if (field.getName(). Equals (" mYearPicker ")) {' con 'if (field.getName(). Equals (" mYearPicker ") | | field.getName(). equals ("mYearSpinner")) {' per account per widget DatePicker in Honeycomb e versioni successive di Android ... –

+2

per gli ultimi Androidi, nascondere anche" mCalendarView " – YKS

8

State molto attenti con questa soluzione. stai usando la riflessione per accedere a un campo e cambiare la visibilità. Questo non funzionerà con Android 5.0! Google ha cambiato l'implementazione di TimePicker e DatePicker e le classi non espongono più alcun campo a parte dal delegato.

Non conosco ancora la soluzione per Android 5.0 +. Vi farò sapere non appena ho trovato qualcosa di interessante.

Come idea, è possibile utilizzare Build.VERSION.SDK_INT per verificare la versione di Android e quindi provare ad accedere a DatePickerSpinnerDelegate utilizzando reflexion e impostare il campo desiderato.

Ancora una volta, questa non è la soluzione ideale come Google sono liberi di cambiare questo ancora e ancora ...

+0

quindi qual è la soluzione per Android 5.0+? – RDD

+0

Non ho mai trovato nessuna buona soluzione. Per il nostro progetto ho semplicemente usato il DatePicker fornito con la selezione dell'anno ... Puoi anche dare un'occhiata a questo https://android-arsenal.com/tag/27. Potrebbe essere utile se stai cercando una libreria DatePicker personalizzabile. – rontho

+1

ho creato un componente personalizzato seguendo [questo] (http://stackoverflow.com/questions/21321789/android-datepicker-change-to-only-month-and-year) e ottenuto ciò che voglio. – RDD

1

Un modo semplice per disattivare campo anno nella selezione data

DatePicker dp = findDatePicker((ViewGroup) dialog.getWindow().getDecorView()); 

if(dp != null) 
{ 
    ((ViewGroup) ((ViewGroup) dp.getChildAt(0)).getChildAt(0)).getChildAt(2).setEnabled(false); 
    ((ViewGroup) ((ViewGroup) dp.getChildAt(0)).getChildAt(0)).getChildAt(2).setAlpha(0.4f); 
} 

se si desidera rimuovere campo anno appena setvisibility di vista risultato View.GONE come qui di seguito

dp.getChildAt(0)).getChildAt(0)).getChildAt(2).setVisibility(View.GONE) 



private DatePicker findDatePicker(ViewGroup group) { 
    if (group != null) { 
     for (int i = 0, j = group.getChildCount(); i < j; i++) { 
      View child = group.getChildAt(i); 
      if (child instanceof DatePicker) { 
       return (DatePicker) child; 
      } else if (child instanceof ViewGroup) { 
       DatePicker result = findDatePicker((ViewGroup) child); 
       if (result != null) 
        return result; 
      } 
     } 
    } 
    return null; 

} 

ho refered collegamento sotto per riferimento Remove year from DatePickerDialog

+0

arresti anomali su Android 7 - Tentativo di invocare il metodo virtuale 'void android.view.View.setVisibility (int)' su un oggetto nullo di riferimento –

1

È possibile impostare serie dell'anno utilizzando questa funzione

datePicker.setYearRange(1950,2017);