Search code examples
javaandroiddatepickerandroid-edittexttimepicker

Android Date Picker Fragment can not be set to Custom date


In here 'onClickListner' on 'Image Button' my custom 'DatePickerFragment' is displaying to select the date. Below is the code for

DatePickerFragment.java

import android.app.DatePickerDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.util.Log;
import android.widget.DatePicker;

import java.util.Calendar;

/**
 * Created by Admin on 9/4/18.
 */
public class DatePickerFragment extends DialogFragment
        implements DatePickerDialog.OnDateSetListener {

    private onDatePickerListener mListener;
    private boolean future;

    public DatePickerFragment(){

    }

//    public DatePickerFragment(boolean future){
//        this.future=future;
//    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current date as the default date in the picker
        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);

        Log.d("DATE_PICKER", " CURRENT_MONTH " + month);

        int day = c.get(Calendar.DAY_OF_MONTH);
        DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(), R.style.AppBaseTheme,this, year, month, day);

        if(isFuture() ==false){
            datePickerDialog.getDatePicker().setMaxDate(System.currentTimeMillis());
        }
        // Create a new instance of DatePickerDialog and return it
        return datePickerDialog;
    }

    public void onDateSet(DatePicker view, int year, int month, int day) {
        // Do something with the date chosen by the user
        callListener(year, month, day);
    }

    public DialogFragment setCallbackListener(onDatePickerListener listener) {
        mListener = listener;
        return null;
    }

    private void callListener(int year, int month, int day) {
        if (mListener != null) mListener.onDataSet(year, month, day);
    }

    public boolean isFuture() {
        return future;
    }

    public void setFuture(boolean future) {
        this.future = future;
    }

    public interface onDatePickerListener {
        void onDataSet(int year, int month, int day);
    }
}

Then I call this 'Fragment' in my 'MainActivity' to set the date to 'EditText' when click on the 'OK' button from the 'DatePickerFragment'.

MainActivity.java

import android.app.TimePickerDialog;
import android.content.Context;
import android.content.Intent;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.format.Time;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import com.sample.DatePickerFragment;

public class AddInterestedKarmaActivity extends AppCompatActivity {   

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_interested_karma);

        ButterKnife.bind(this);
        context = this;

        EditText dateEdittext = (Edittext)findViewById(R.id.date_edit);
        setDate(dateEditText);

    }    

    private void setDate(final EditText dateEditText){

            datePickerFragment.setCallbackListener(new DatePickerFragment.onDatePickerListener() {
                @Override
                public void onDataSet(int year, int month, int day) {

                    int currentMonth = 0;

                    if (month == 0) {
                        currentMonth = 1;
                    } else if (month == 1) {
                        currentMonth = 2;
                    } else if (month == 2) {
                        currentMonth = 3;
                    } else if (month == 3) {
                        currentMonth = 4;
                    } else if (month == 4) {
                        currentMonth = 5;
                    } else if (month == 5) {
                        currentMonth = 6;
                    } else if (month == 6) {
                        currentMonth = 7;
                    } else if (month == 7) {
                        currentMonth = 8;
                    } else if (month == 8) {
                        currentMonth = 9;
                    } else if (month == 9) {
                        currentMonth = 10;
                    } else if (month == 10) {
                        currentMonth = 11;
                    } else if (month == 11) {
                        currentMonth = 12;
                    } else if (month == 12) {

                    }

                    dateEditText.setText(day + "/" + currentMonth + "/" + year);

                }
            });

        }

        DialogFragment datePicker = datePickerFragment;

        datePicker.show(getSupportFragmentManager(), "datePicker");
    }

    private void setTime(final EditText timeEditText){

        final Calendar c = Calendar.getInstance();
        mHour = c.get(Calendar.HOUR_OF_DAY);
        mMinute = c.get(Calendar.MINUTE);

        TimePickerDialog timePickerDialog = new TimePickerDialog(context,
                new TimePickerDialog.OnTimeSetListener() {

                    @Override
                    public void onTimeSet(TimePicker view, int hourOfDay,
                                          int minute) {

                        String curTime = String.format("%02d:%02d", hourOfDay, minute);
                        timeEditText.setText(curTime);
                    }
                }, mHour, mMinute, false);

        timePickerDialog.show();
    }
}

I need to set the Date of 'DatePickerFragmenet' for a custom date (not today). such as set the 'DatePickerFragment' onCreate() to the mentioned above final int y, m, d values that from 'dateEditText'. And also I need to set the custom 'time' to the 'TimePickerDialog' such as 'DatePickerFragment'.


Solution

  • There is one function in DatePickerDialog to set custom date(updateDate(year_, month_, day_))

    According to your code you need to make changes in your DatePickerFragment in onCreateDialog of DatePickerFragment where you are getting date, month and year from calendar, instead of getting that from Calendar provide your custom dates.

    Updated class is below

    public class DatePickerFragment extends DialogFragment
            implements DatePickerDialog.OnDateSetListener {
    
        private onDatePickerListener mListener;
        private boolean future;
        int day_;
        int month_;
        int year_;
        private DatePickerDialog datePickerDialog;
    
    
        public DatePickerFragment() {
    
        }
    
    
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            // Use the current date as the default date in the picker
    //        final Calendar c = Calendar.getInstance();
    //        int year = c.get(Calendar.YEAR);
    //        int month = c.get(Calendar.MONTH);
    
            //    Log.d("DATE_PICKER", " CURRENT_MONTH " + month);
    
            //   int day = c.get(Calendar.DAY_OF_MONTH);
            datePickerDialog = new DatePickerDialog(getActivity(), R.style.AppTheme, this, year_, month_, day_);
    
            if (isFuture() == false) {
                datePickerDialog.getDatePicker().setMaxDate(System.currentTimeMillis());
            }
          //  datePickerDialog.updateDate(year_, month_, day_);
    
            // Create a new instance of DatePickerDialog and return it
            return datePickerDialog;
        }
    
    
        public void onDateSet(DatePicker view, int year, int month, int day) {
            // Do something with the date chosen by the user
            callListener(year, month, day);
        }
    
        public DialogFragment setCallbackListener(onDatePickerListener listener) {
            mListener = listener;
            return null;
        }
    
        private void callListener(int year, int month, int day) {
            if (mListener != null) mListener.onDataSet(year, month, day);
        }
    
        public boolean isFuture() {
            return future;
        }
    
        public void setFuture(boolean future) {
            this.future = future;
        }
    
        public interface onDatePickerListener {
            void onDataSet(int year, int month, int day);
        }
    }
    

    In your activity, you need to provide custom date. Updated Activity is below, you can add your custom date.

    public class AddInterestedKarmaActivity extends AppCompatActivity {
    
        DatePickerFragment datePickerDialog;
        EditText dateEdittext;
        String customDate = "12/12/2007"; //dd/mm/yy
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_add_interested_karma);
    
    
            dateEdittext = (EditText) findViewById(R.id.date_edit);
            //  setDate(dateEditText);
    
    
            datePickerDialog = new DatePickerFragment();
            datePickerDialog.day_ = getDay();
            datePickerDialog.month_ = getMonth();
            datePickerDialog.year_ = getYear();
    
            datePickerDialog.setCallbackListener(new DatePickerFragment.onDatePickerListener() {
                                                     @Override
                                                     public void onDataSet(int year, int month, int day) {
                                                         month = month + 1;
                                                         dateEdittext.setText(day + "/" + month + "/" + year);
    
                                                     }
                                                 }
            );
    
            datePickerDialog.show(getSupportFragmentManager(), "datePicker");
    
        }
    
        private int getYear() {
            return Integer.parseInt(changeDateFormat(customDate, "MM/dd/yyyy", "YYYY"));
    
        }
    
        private int getMonth() {
            return Integer.parseInt(changeDateFormat(customDate, "MM/dd/yyyy", "MM")) - 1;  //substract one from month because month gets start from 0 in Calendar.
    
        }
    
        private int getDay() {
            return Integer.parseInt(changeDateFormat(customDate, "MM/dd/yyyy", "dd"));
        }
    
    
        public String changeDateFormat(String dateString, String sourceDateFormat, String targetDateFormat) {
            if (dateString == null || dateString.isEmpty())
                return "";
    
            SimpleDateFormat inputDateFromat = new SimpleDateFormat(sourceDateFormat, Locale.US);
            Date date = new Date();
    
            try {
                date = inputDateFromat.parse(dateString);
            } catch (ParseException e) {
                e.printStackTrace();
            }
    
            SimpleDateFormat outputDateFormat = new SimpleDateFormat(targetDateFormat, Locale.US);
    
            return outputDateFormat.format(date);
        }
    
    
    }