3

Currently I m using native dialog box with modification to hide date Spinner and that is working fine.

But now i want to set date in such a format that when i spin month spinner or year spinner the Dialog box simply show the month and year not the complete calender date my custom code for date picker dialog is following :

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

When dialog box first time get popped up it works fine as i set the title of the

DatePickerDialog.setTitle("");

but that works fine when dialog box get popped up for the first time but i want to update on ondatechangelistner so how can i do that

Usman Kurd
  • 7,212
  • 7
  • 57
  • 86

1 Answers1

2

After Brain Storming half a day i have found this solution this may help other having such scenarios

My Custom class for date Picker is Following that will update the date in title every time user change month/year

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

and the following is the code that will hide the day and its spinner from the date picker dialog

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();
Usman Kurd
  • 7,212
  • 7
  • 57
  • 86