DatePicker widget
Android DatePicker provides a widget for selecting the date consisting of day, month and year in your custom user interface.
When the datePickerMode
attribute is set to spinner, the date can be selected using year, month, and day spinners or a CalendarView
. The set of spinners and the calendar view are automatically synchronized. The client can customize whether only the spinners, or only the calendar view, or both to be displayed.
When the datePickerMode
attribute is set to calendar, the month and day can be selected using a calendar-style view while the year can be selected separately using a list.
Following is layout file.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:padding="5dp" android:layout_width="match_parent" android:layout_height="match_parent"> <DatePicker android:id="@+id/dpDate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:datePickerMode="spinner" android:calendarViewShown="false" /> <Button android:id="@+id/btnGet" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Get date" android:onClick="getDate"/> </LinearLayout>
Following is MainActivity.java file.
public class MainActivity extends AppCompatActivity { DatePicker dpDate; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dpDate = (DatePicker)findViewById(R.id.dpDate); // init // dpDate.init(2002, 10, 27, null); } public void getDate(View v) { StringBuilder builder=new StringBuilder(); builder.append("Current Date: "); builder.append((dpDate.getMonth() + 1)+"/");//month is 0 based builder.append(dpDate.getDayOfMonth()+"/"); builder.append(dpDate.getYear()); Toast.makeText(this, builder.toString(), Toast.LENGTH_SHORT).show(); } }
Result
Following is a DatePicker
example in Kotlin.
class MainActivity : AppCompatActivity() { private lateinit var calendar:Calendar override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // Initialize a new calendar instance calendar = Calendar.getInstance() // Get the Calendar current year, month and day of month val thisYear = calendar.get(Calendar.YEAR) val month = calendar.get(Calendar.MONTH) val day = calendar.get(Calendar.DAY_OF_MONTH) // Initialize the date picker widget with system current date date_picker.init( thisYear, month, day, DatePicker.OnDateChangedListener {view, year, monthOfYear, dayOfMonth -> // Display the date picker selected date on text view text_view.text = "Date Changed : ${formatDate(year,monthOfYear,dayOfMonth)}" } ) // Set a click listener for set date button widget button_set.setOnClickListener{ // Update the date picker data by a random date val year = randomInRange(2000,2025) val month = randomInRange(0,11) val day = randomInRange(0,27) // Update the date picker with random date date_picker.updateDate( year, // Year month, // The month which is starting from zero. day // Day of month ) // Toast the new date Toast.makeText( applicationContext, "Set Date : ${formatDate(year,month,day)}", Toast.LENGTH_SHORT).show() } // Set a click listener for get date button widget button_get.setOnClickListener{ // Get the date picker widget selected date val selectedDate = formatDate(date_picker.year,date_picker.month,date_picker.dayOfMonth) // Display the date picker selected formatted date text_view.text = "Selected Date : $selectedDate" } } // Custom method to format date private fun formatDate(year:Int, month:Int, day:Int):String{ // Create a Date variable/object with user chosen date calendar.set(year, month, day, 0, 0, 0) val chosenDate = calendar.time // Format the date picker selected date val df = DateFormat.getDateInstance(DateFormat.MEDIUM) return df.format(chosenDate) } // Custom method to get a random number from the provided range private fun randomInRange(min:Int, max:Int):Int{ // Define a new Random class val r = Random() // Get the next random number within range // Including both minimum and maximum number return r.nextInt((max - min) + 1) + min; } }
TimePicker widget
Android TimePicker provides a widget for selecting the time of day, in either 24-hour or AM/PM mode. You cannot select time by seconds.
timePickerMode
attribute defines the look of the widget. It could be either clock
or spinner
.
In order to get the time selected by the user on the screen, you will use getCurrentHour()
and getCurrentMinute()
method of the TimePicker
class.
Following is layout file.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:padding="5dp" android:layout_width="match_parent" android:layout_height="match_parent"> <TimePicker android:id="@+id/tpTime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:timePickerMode="spinner" /> </LinearLayout>
Following is MainActivity.java file.
public class MainActivity extends AppCompatActivity { TimePicker tpTime; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tpTime = (TimePicker)findViewById(R.id.tpTime); // set the time picker mode to 24 hour view tpTime.setIs24HourView(true); // set a time changed listener to time picker tpTime.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() { @Override public void onTimeChanged(TimePicker timePicker, int i, int i1) { String time = "Current time: " + timePicker.getCurrentHour() + " : " + timePicker.getCurrentMinute(); Toast.makeText(getApplicationContext(), time, Toast.LENGTH_SHORT).show(); } }); } }
Result
Following is a TimePicker
example in Kotlin.
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // Set a time change listener for time picker widget time_picker.setOnTimeChangedListener{ view,hourOfDay,minute-> text_view.text = "Time(HH:MM) ${getHourAMPM(hourOfDay)} " + ": $minute ${getAMPM(hourOfDay)}" } } // Custom method to get time picker current time as string private fun getPickerTime(timePicker: TimePicker):String{ val hour = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { timePicker.hour } else { timePicker.currentHour } val minute = if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ timePicker.minute }else{ timePicker.currentMinute } return "${getHourAMPM(hour)} : $minute ${getAMPM(hour)}" } // Custom method to set time picker time private fun setPickerTime(timePicker: TimePicker){ // Get random time val hour = randomInRange(0,23) val minute = randomInRange(0,59) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { timePicker.hour = hour timePicker.minute = minute }else{ timePicker.currentHour = hour timePicker.currentMinute = minute } } // Custom method to get AM PM value from provided hour private fun getAMPM(hour:Int):String{ return if(hour>11)"PM" else "AM" } // Custom method to get hour for AM PM time format private fun getHourAMPM(hour:Int):Int{ // Return the hour value for AM PM time format var modifiedHour = if (hour>11)hour-12 else hour if (modifiedHour == 0){modifiedHour = 12} return modifiedHour } // Custom method to get a random number from the provided range private fun randomInRange(min:Int, max:Int):Int{ //define a new Random class val r = Random() //get the next random number within range // Including both minimum and maximum number return r.nextInt((max - min) + 1) + min; } }
TimePickerDialog
Android TimePickerDialog
allows you to select the time of day, in either 24-hour or AM/PM mode in your custom user interface. A dialog that prompts the user for the time of day using a TimePicker
.
To show a TimePickerDialog
we need to define a fragment class (named TimePickerDialog
) which extends the DialogFragment
class (available from API 11) and returns a TimePickerDialog
from its onCreateDialog()
method.
TimePickerDialog
class have onTimeSetListener()
callback method. This callback methods are invoked when the user is done with filling the time.
The TimePickerDialog
class consists of a 5 argument constructor with the parameters listed below.
Context
. It requires the application context.onTimeSet()
is callback function which invoked when the user sets the time with the following parameters:
int hourOfDay
. It will be store the current selected hour of the day from the dialog.int minute
. It will be store the current selected minute from the dialog.int mHours
. It shows the the current hour that’s visible when the dialog pops up.
int mMinute
. It shows the the current minute that’s visible when the dialog pops up.boolean false
. If its set to false it will show the time in 24 hour format else not.Get TimePickerDialog by click on Button.
We will display TimePickerDialog
dialog on click Button
and display date on TextView
.
Following is layout file.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:padding="5dp" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/btnTime" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Get time" android:onClick="getTime"/> <TextView android:id="@+id/tvTime" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18dp"/> </LinearLayout>
Following is MainActivity.java file.
public class MainActivity extends AppCompatActivity { TextView tvTime; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvTime = (TextView) findViewById(R.id.tvTime); } public void getTime(View v) { DialogFragment dlg = new TimePickerFragment(); dlg.show(getSupportFragmentManager(), "TimePicker"); } }
Following is TimePickerDialog.java file.
public class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener { @Override public Dialog onCreateDialog(Bundle savedInstanceState){ // initialize a new Calendar instance final Calendar c = Calendar.getInstance(); // get the current hour of day from calendar int hourOfDay = c.get(Calendar.HOUR_OF_DAY); // get the current minute from calendar int minute = c.get(Calendar.MINUTE); // boolean is24HourView = DateFormat.is24HourFormat(getActivity()); // initialize a new time picker dialog TimePickerDialog timePickerDialog = new TimePickerDialog( getActivity(), // Context this, // Listener hourOfDay, // hourOfDay minute, // Minute true // is24HourView ); // return the newly created time picker dialog return timePickerDialog; } public void onTimeSet(TimePicker view, int hourOfDay, int minute){ // get the TextView reference from activity TextView tv = (TextView) getActivity().findViewById(R.id.tvTime); // do something with selected time tv.setText("" + hourOfDay + ":" + minute); } }
Result
Get TimePicker dialog by click on EditText.
We will display TimePickerDialog
dialog on click EditText
and display date on TextView
.
Following is layout file.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:padding="5dp" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/tvTime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Time: " android:textSize="18dp"/> <EditText android:id="@+id/etTime" android:layout_width="0dp" android:layout_height="wrap_content" android:text="20:00" android:layout_weight="1" android:inputType="none" android:focusable="false"/> </LinearLayout>
Following is MainActivity.java file.
public class MainActivity extends AppCompatActivity { EditText etTime; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); etTime = (EditText) findViewById(R.id.etTime); etTime.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Calendar mcurrentTime = Calendar.getInstance(); int hour = mcurrentTime.get(Calendar.HOUR_OF_DAY); int minute = mcurrentTime.get(Calendar.MINUTE); TimePickerDialog dlg; dlg = new TimePickerDialog(SecondActivity.this, new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute) { etTime.setText(selectedHour + ":" + selectedMinute); } }, hour, minute, true); dlg.setTitle("Select Time"); dlg.show(); } }); } }
Following is a TimePickerDialog
example in Kotlin.
Following is MainActivity.kt.
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // Set a click listener for button widget button.setOnClickListener{ // Initialize a new TimePickerFragment val newFragment = TimePickerFragment() // Show the time picker dialog newFragment.supportFragmentManager(fragmentManager, "Time Picker") } } }
Following is TimePickerFragment.kt.
class TimePickerFragment : DialogFragment(), TimePickerDialog.OnTimeSetListener { private lateinit var calendar:Calendar override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { // Initialize a Calendar instance calendar = Calendar.getInstance() // Get the system current hour and minute val hour = calendar.get(Calendar.HOUR_OF_DAY) val minute = calendar.get(Calendar.MINUTE) // Create a TimePickerDialog with system current time return TimePickerDialog( activity, // Context android.R.style.Theme_Holo_Light_Dialog_NoActionBar_MinWidth, // Theme this, // TimePickerDialog.OnTimeSetListener hour, // Hour of day minute, // Minute false // Is 24 hour view ) } override fun onTimeSet(view: TimePicker, hourOfDay: Int, minute: Int) { // Do something with the returned time val tv:TextView = activity.findViewById(R.id.text_view) as TextView tv.text = "Hour : Minute\n${getHourAMPM(hourOfDay)}:$minute ${getAMPM(hourOfDay)}" } // When user cancel the time picker dialog override fun onCancel(dialog: DialogInterface?) { Toast.makeText(activity,"Picker Canceled.",Toast.LENGTH_SHORT).show() super.onCancel(dialog) } // Custom method to get AM PM value from provided hour private fun getAMPM(hour:Int):String{ return if(hour>11)"PM" else "AM" } // Custom method to get hour for AM PM time format private fun getHourAMPM(hour:Int):Int{ // Return the hour value for AM PM time format var modifiedHour = if (hour>11)hour-12 else hour if (modifiedHour == 0){modifiedHour = 12} return modifiedHour } }
DatePickerDialog
Android DatePickerDialog
allows you to select the date consisting of day, month and year in your custom user interface. It's a simple dialog containing an DatePicker
.
To show a DatePickerDialog
we need to define a fragment class (named DatePickerFragment
) which extends the DialogFragment
class (available from API 11) and returns a DatePickerDialog
from its onCreateDialog()
method.
DatePickerDialog
class have onDateSetListener()
callback method. This callback methods are invoked when the user is done with filling the date.
The DatePickerDialog
class consists of a 5 argument constructor with the parameters listed below.
Context
. It requires the application context.onDateSet()
is a callback function which invoked when the user sets the date with the following parameters
int year
. It will be store the current selected year from the dialog.int monthOfYear
. It will be store the current selected month from the dialog.int dayOfMonth
. It will be store the current selected day from the dialog.int mYear
. It shows the the current year that’s visible when the dialog pops up.
int mMonth
. It shows the the current month that’s visible when the dialog pops up.int mDay
. It shows the the current day that’s visible when the dialog pops up.We will display DatePickerDialog
dialog on click Button
and display date on TextView
.
Following is layout file.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:padding="5dp" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/btnDate" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Get date" android:onClick="getDate"/> <TextView android:id="@+id/tvDate" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18dp"/> </LinearLayout>
To display DatePickerDialog
, we will create a DatePickerFragment
class that extends DialogFragment
. Define the onCreateDialog()
method to return an instance of DatePickerDialog
.
public class DatePickerFragment extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final Calendar c = Calendar.getInstance(); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH); int day = c.get(Calendar.DAY_OF_MONTH); return new DatePickerDialog(getActivity(), (DatePickerDialog.OnDateSetListener) getActivity(), year, month, day); } }
We need to implement DatePickerDialog.OnDateSetListener
interface to receive a callback when the user sets the date. Add onDateSet()
method to sets the date by user.
public class MainActivity extends AppCompatActivity implements DatePickerDialog.OnDateSetListener { TextView tvDate; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvDate = (TextView) findViewById(R.id.tvDate); } @Override public void onDateSet(DatePicker view, int year, int month, int day) { Calendar cal = new GregorianCalendar(year, month, day); final DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM); Log.d("VVV", dateFormat.format(cal.getTime())); tvDate.setText(dateFormat.format(cal.getTime())); } public void getDate(View v) { DatePickerFragment fragment = new DatePickerFragment(); fragment.show(getSupportFragmentManager(), "Date dialog"); } }
Result
If you want to change color in DatePickerDialog
use following approach. First, define new style for DatePickerDialog
in styles.xml.
<resources> ... <style name="DatePicker" parent="Theme.AppCompat.Light.Dialog"> <item name="colorAccent">#5C9BE5</item> </style> </resources>
Second, add style ID to the constructor of DatePickerDialog
.
return new DatePickerDialog(getActivity(), R.style.DatePicker, (DatePickerDialog.OnDateSetListener) getActivity(), year, month, day);
We can also change theme of DatePickerDialog
by passing themeResId
.
int themeResId = 2; return new DatePickerDialog(getActivity(), themeResId, (DatePickerDialog.OnDateSetListener) getActivity(), year, month, day);
Result
Following is a DatePickerDialog
example in Kotlin.
Following is MainActivity.kt.
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // Set a click listener for button widget button.setOnClickListener{ // Initialize a new DatePickerFragment val newFragment = DatePickerFragment() // Show the date picker dialog newFragment.show(supportFragmentManager, "Date Picker") } } }
Following is DatePickerFragment.kt.
class DatePickerFragment : DialogFragment(), DatePickerDialog.OnDateSetListener { private lateinit var calendar:Calendar override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { // Initialize a calendar instance calendar = Calendar.getInstance() // Get the system current date val year = calendar.get(Calendar.YEAR) val month = calendar.get(Calendar.MONTH) val day = calendar.get(Calendar.DAY_OF_MONTH) // Initialize a new date picker dialog and return it return DatePickerDialog( activity, // Context // Put 0 to system default theme or remove this parameter android.R.style.Theme_Holo_Light_Dialog_NoActionBar_MinWidth, // Theme this, // DatePickerDialog.OnDateSetListener year, // Year month, // Month of year day // Day of month ) } // When date set and press ok button in date picker dialog override fun onDateSet(view: DatePicker, year: Int, month: Int, day: Int) { Toast.makeText( activity, "Date Set : ${formatDate(year,month,day)}" ,Toast.LENGTH_SHORT ).show() // Display the selected date in text view activity?.findViewById<TextView>(R.id.text_view)?.text = formatDate(year,month,day) } // Custom method to format date private fun formatDate(year:Int, month:Int, day:Int):String{ // Create a Date variable/object with user chosen date calendar.set(year, month, day, 0, 0, 0) val chosenDate = calendar.time // Format the date picker selected date val df = DateFormat.getDateInstance(DateFormat.MEDIUM) return df.format(chosenDate) } }
Other libs for Date/Time pick