Hot questions for Using Android EditText in timepicker

Question:

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'.


Answer:

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


}

Question:

Error messages:

There are two problems and one of them is causing the time picker not to run and the app to crash when I click on the field of the edit text which runs the time picker when clicked on.

  1. The 'v' in v.setText... gets an error: 'The method setText(String) is undefined for the type View'. I added a cast like this: '((EditText) v).setText...' and there wasn't an error with it anymore but it is still not working

  2. The error message I get when I put 'this' in the time picker dialog listener is: The constructor TimePickerDialog(new View.OnClickListener(){}, new TimePickerDialog.OnTimeSetListener(){}, int, int, boolean) is undefined

    editTextTime.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(final View v) {
    
    
            final Calendar c = Calendar.getInstance();
            mHour = c.get(Calendar.HOUR_OF_DAY);
            mMinute = c.get(Calendar.MINUTE);
    
    
            TimePickerDialog tpd = new TimePickerDialog(**this**,//same Activity Context like before
                    new TimePickerDialog.OnTimeSetListener() {
    
                        @Override
                        public void onTimeSet(TimePicker view, int hourOfDay,
                                int minute) {
    
    
                            ((EditText) v).setText(hourOfDay + ":" + minute); //You set the time for the EditText created
                        }
    
    
    
                    }, mHour, mMinute, true);
            tpd.show();
    
    
    
        }
    });
    

Answer:

this refers to anonymous class implementing OnClickListener. To get reference to Context (Activity) you need to provide

Activity.this