5

Desidero che un selettore di date mostri solo il mese e l'anno. Ho personalizzato il selettore di date per farlo, ad esempio, per rimuovere il campo "giorno" dal selettore, ma in Android Lollipop sto ricevendo il selettore con giorno, mese e anno. Di seguito è il mio pezzo di codice. Per favore aiutami a conoscere il problema. Grazie in anticipo.Finestra di dialogo Selezione data personalizzata in Android Lollipop

try { 
     Field f[] = mDatePicker.getClass().getDeclaredFields(); 
     for (Field field : f) { 

      if (field.getName().equals("mDaySpinner") || field.getName().equals("mDayPicker")) { 
       field.setAccessible(true); 
       Object dayPicker = new Object(); 
       dayPicker = field.get(mDatePicker); 
       ((View) dayPicker).setVisibility(View.GONE); 
      } 

     } 
    } catch (SecurityException e) { 
    } catch (IllegalArgumentException e) { 
    } catch (IllegalAccessException e) { 
    } 
+0

Che cosa non funziona? L'app si arresta in modo anomalo? In tal caso, pubblica lo stacktrace. –

+0

mostrando anche il giorno, che non è corretto nel mio caso. Dovrebbe visualizzare solo il mese e l'anno. Funzionando correttamente fino a Kitkat. –

+1

L'IMHO che accede agli interni nella classe di selezione data è una cattiva prassi. Dipende dai campi in questione che hanno determinati nomi; se i nomi cambiano ... penso che sia meglio implementare il proprio widget personalizzato con due normali spinner numerici. –

risposta

10

utilizzando la riflessione di trovare e nascondere elementi di interfaccia utente non è davvero una grande pratica. Nel tuo caso, ha smesso di funzionare in lollipop perché lo mDaySpinner è ora contenuto in una classe statica privata interna DatePickerSpinngerDelegate all'interno della classe DatePicker.

Si consiglia di passare attraverso la gerarchia di visualizzazione per trovare e nascondere invece l'elemento di selezione giorno. Ho scritto il seguente codice che funziona in lecca-lecca:

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    int daySpinnerId = Resources.getSystem().getIdentifier("day", "id", "android"); 
    if (daySpinnerId != 0) { 
     View daySpinner = datePicker.findViewById(daySpinnerId); 
     if (daySpinner != null) { 
      daySpinner.setVisibility(View.GONE); 
     } 
    } 
} 
+0

funziona come un fascino !! – Orr

+0

great works man –

+0

@alanv L'esempio di codice in questa risposta è _non_ utilizzando la reflection. In realtà, questa risposta sconsiglia specificamente l'uso del riflesso dicendo che non è una grande pratica. Forse hai inteso il tuo commento per l'esempio di codice nella domanda originale, che in realtà usa la riflessione. – cse

0

Questo è un esempio di base di un mese picker, ma può essere facilmente adattato a raccogliere anche l'anno e/o il giorno (funziona anche per le versioni di Android precedenti):

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

}

-1

andato avanti facendo una modifica Selezione data chiamato Simple Data picker ... hanno utilizzato il codice simile a Selezione data solo per mostrare mese e anno

vedi https://github.com/resengupta/Month-Year-Date-Picker

La classe SimpleDatePickerDialog.java è responsabile della visualizzazione del selettore numero di mesi e anni. SimpleDatePickerDelegate.java funziona per applicare le regole ai selettori di numeri. SimpleDatePickerDialogFragment.java è un oggetto DialogFragment che racchiude la finestra di avviso.