2013-08-15 5 views
3

В настоящее время я использую собственное диалоговое окно с модификацией, чтобы скрыть дату Spinner, и это работает нормально.Custom Date Picker Dialog

Но теперь я хочу, чтобы установить дату в таком формате, что, когда я прясть месяц блесну или год спиннера диалоговом окне просто показать месяц и год не полная дата каландр мой собственный код для диалога выбора даты выглядит следующим образом:

@Override 
protected Dialog onCreateDialog(int id) { 
    switch (id) { 
    case DATE_DIALOG_ID: 
     // set date picker as current date 


     DatePickerDialog datePickerDialog = this.customDatePicker(); 
     return datePickerDialog; 
    } 
    return null; 
} 


private DatePickerDialog.OnDateSetListener datePickerListener 
      = new DatePickerDialog.OnDateSetListener() { 


    // when dialog box is closed, below method will be called. 
    @Override 
    public void onDateSet(DatePicker datepickerView, int selectedYear, 
      int selectedMonth, int selectedDay) { 


    /* year = selectedYear; 
     month = selectedMonth; 
     day = selectedDay;*/ 

     mynewYear=selectedYear; 
     myNewMonth=selectedMonth; 
     myNewDay=selectedDay; 

     try { 
      checkDate(); 
     } catch (NoSuchAlgorithmException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     /*time_date_TV.setText(new StringBuilder() 
      .append(myNewMonth + 1).append("/") 
      .append(myNewDay).append("/").append(mynewYear)); 
       */ 





    } 
}; 

private DatePickerDialog customDatePicker() { 

    DatePickerDialog dpd = new DatePickerDialog(context, android.R.style.Theme_Holo_Light_Dialog,datePickerListener, 
      year, month,day); 
    if(month==0) 
     { 
      mmonth="January"; 
     } 
     if(month==1) 
     { 
      mmonth="Faburary"; 
     } 
     if(month==2) 
     { 
      mmonth="March"; 
     } 
     if(month==3) 
     { 
      mmonth="April"; 
     } 
     if(month==4) 
     { 
      mmonth="May"; 
     } 
     if(month==5) 
     { 
      mmonth="June"; 
     } 
     if(month==6) 
     { 
      mmonth="July"; 
     } 
     if(month==7) 
     { 
      mmonth="August"; 
     } 
     if(month==8) 
     { 
      mmonth="September"; 
     }if(month==9) 
     { 
      mmonth="October"; 
     } 
     if(month==10) 
     { 
      mmonth="November"; 
     } 
     if(month==11) 
     { 
      mmonth="December"; 
     } 

    dpd.setTitle(""+mmonth+", "+year); 
    try { 

    Field[] datePickerDialogFields = dpd.getClass().getDeclaredFields(); 
    for (Field datePickerDialogField : datePickerDialogFields) { 
    if (datePickerDialogField.getName().equals("mDatePicker")) { 
    datePickerDialogField.setAccessible(true); 
    DatePicker datePicker = (DatePicker) datePickerDialogField 
    .get(dpd); 

    Field datePickerFields[] = datePickerDialogField.getType() 
    .getDeclaredFields(); 
    for (Field datePickerField : datePickerFields) { 
    if ("mDayPicker".equals(datePickerField.getName()) 
    || "mDaySpinner".equals(datePickerField 
    .getName())) { 
    datePickerField.setAccessible(true); 
    Object dayPicker = new Object(); 
    dayPicker = datePickerField.get(datePicker); 
    ((View) dayPicker).setVisibility(View.GONE); 
    } 
    } 
    } 

    } 
    } catch (Exception ex) { 
    } 
    return dpd; 
    } 

когда диалоговое окно в первый раз получить выскочил это работает отлично, как я установить название

DatePickerDialog.setTitle("");

но работает хорошо, когда диалоговое окно получить выскочило в первый раз, но я хочу обновить ondatechangelistner так, как я могу это сделать

ответ

2

После мозгового штурма полдня я нашел это решение, это может помочь другим, имеющие такие сценарии

Мой заказ класс для выбора даты является После этого будет обновлять дату в заголовке каждый раз, когда изменение пользователя месяц/год

class CustomDatePickerDialog extends DatePickerDialog implements OnDateChangedListener { 

private DatePickerDialog mDatePicker; 

@SuppressLint("NewApi") 
public CustomDatePickerDialog(Context context,int theme, OnDateSetListener callBack, 
     int year, int monthOfYear, int dayOfMonth) { 
    super(context, theme,callBack, year, monthOfYear, dayOfMonth); 
    mDatePicker = new DatePickerDialog(context,theme,callBack, year, monthOfYear, dayOfMonth); 

    mDatePicker.getDatePicker().init(2013, 7, 16, this); 

    updateTitle(year, monthOfYear); 

} 
public void onDateChanged(DatePicker view, int year, 
     int month, int day) { 
    updateTitle(year, month); 
} 
private void updateTitle(int year, int month) { 
    Calendar mCalendar = Calendar.getInstance(); 
    mCalendar.set(Calendar.YEAR, year); 
    mCalendar.set(Calendar.MONTH, month); 
//  mCalendar.set(Calendar.DAY_OF_MONTH, day); 
     mDatePicker.setTitle(getFormat().format(mCalendar.getTime())); 

} 

public DatePickerDialog getPicker(){ 

    return this.mDatePicker; 
} 
    /* 
    * the format for dialog tile,and you can override this method 
    */ 
public SimpleDateFormat getFormat(){ 
    return new SimpleDateFormat("MMM, yyyy"); 
}; 
} 

и следующий код, который скроет день и его кок из диалогового окна выбора даты

CustomDatePickerDialog dp = new CustomDatePickerDialog(context, android.R.style.Theme_Holo_Light_Dialog, datePickerListener, year, month, day); 

       DatePickerDialog obj = dp.getPicker(); 
       try{ 
         Field[] datePickerDialogFields = obj.getClass().getDeclaredFields(); 
         for (Field datePickerDialogField : datePickerDialogFields) { 
          if (datePickerDialogField.getName().equals("mDatePicker")) { 
           datePickerDialogField.setAccessible(true); 
           DatePicker datePicker = (DatePicker) datePickerDialogField.get(obj); 
           Field datePickerFields[] = datePickerDialogField.getType().getDeclaredFields(); 
           for (Field datePickerField : datePickerFields) { 
            if ("mDayPicker".equals(datePickerField.getName()) || "mDaySpinner".equals(datePickerField 
             .getName())) { 
             datePickerField.setAccessible(true); 
             Object dayPicker = new Object(); 
             dayPicker = datePickerField.get(datePicker); 
             ((View) dayPicker).setVisibility(View.GONE); 
            } 
           } 
           } 

          } 
         }catch(Exception ex){ 
         } 
       obj.show();