Reputation: 415
I'm making a DateTime Picker so that I get timePicker fragment right after I have selected a date on datePicker fragment and get a Calendar object out of the pickers.
DatePicker Fragment
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener
{
@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);
int day = c.get(Calendar.DAY_OF_MONTH);
// Create a new instance of DatePickerDialog and return it
return new DatePickerDialog(getActivity(), this, year, month, day);
}
public void onDateSet(DatePicker view, int year, int month, int day) {
}
}
TimePicker fragment
public class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener
{
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
final Calendar c=Calendar.getInstance();
int hour=c.get(Calendar.HOUR_OF_DAY);
int minute=c.get(Calendar.MINUTE);
return new TimePickerDialog(getActivity(),this,hour,minute, DateFormat.is24HourFormat(getActivity()));
}
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
}
}
How do I connect these fragment to show after one another and how do I get a single Calendar object after getting data from both the fragments?
Upvotes: 4
Views: 2561
Reputation: 7081
You can use listeners to link your fragments
to one another. I took what you had and modified it a bit by adding a listener for each fragment
. I then created a delegate that manages the two fragments
and merges the results neatly into one Calendar
object. You can retrieve the result however you want. Probably with another listener.
NOTE that this is not the best solution architecturally speaking as I threw it together in a few minutes. You can move stuff around to get the pattern that best suits the scenario.
Here's the example code.
You can invoke the dialog from your Activity
like this
private void showDateTimeDialog() {
final FragmentManager fm = getSupportFragmentManager();
DateTimeDialog dateTimeDialog = new DateTimeDialog(this, fm);
dateTimeDialog.show();
}
DateTimeDialog.java
import android.app.Activity;
import android.support.v4.app.FragmentManager;
import android.widget.Toast;
import java.util.Calendar;
public class DateTimeDialog {
private Activity activity;
private DatePickerFragment datePickerFragment;
private TimePickerFragment timePickerFragment;
private FragmentManager fragmentManager;
private Calendar calendar;
public DateTimeDialog(Activity activity, FragmentManager fragmentManager) {
this.activity = activity;
this.fragmentManager = fragmentManager;
this.calendar = Calendar.getInstance();
this.datePickerFragment = new DatePickerFragment();
this.timePickerFragment = new TimePickerFragment();
this.datePickerFragment.setOnDateSelectedListener(getOnDateSelectedListener());
this.timePickerFragment.setOnTimeSelectedListener(getOnTimeSelectedListener());
}
public void show() {
datePickerFragment.show(fragmentManager, "datePickerFragment");
}
private TimePickerFragment.OnTimeSelectedListener getOnTimeSelectedListener() {
return new TimePickerFragment.OnTimeSelectedListener() {
@Override
public void onTimeSelected(int hourOfDay, int minute) {
calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
calendar.set(Calendar.MINUTE, minute);
// Here you have your finished result.
Toast.makeText(activity, calendar.getTime().toString(), Toast.LENGTH_LONG).show();
}
};
}
private DatePickerFragment.OnDateSelectedListener getOnDateSelectedListener() {
return new DatePickerFragment.OnDateSelectedListener() {
@Override
public void onDateSelected(int year, int monthOfYear, int dayOfMonth) {
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, monthOfYear);
calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
timePickerFragment.show(fragmentManager, "timePickerFragment");
}
};
}
}
DatePickerFragment.java
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.widget.DatePicker;
import java.util.Calendar;
public class DatePickerFragment
extends DialogFragment implements DatePickerDialog.OnDateSetListener {
private OnDateSelectedListener onDateSelectedListener;
public void setOnDateSelectedListener(OnDateSelectedListener onDateSelectedListener) {
this.onDateSelectedListener = onDateSelectedListener;
}
@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);
int day = c.get(Calendar.DAY_OF_MONTH);
// Create a new instance of DatePickerDialog and return it
return new DatePickerDialog(getActivity(), this, year, month, day);
}
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
onDateSelectedListener.onDateSelected(year, monthOfYear, dayOfMonth);
}
public interface OnDateSelectedListener {
void onDateSelected(int year, int monthOfYear, int dayOfMonth);
}
}
TimePickerFragment.java
import android.app.Dialog;
import android.app.TimePickerDialog;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.text.format.DateFormat;
import android.widget.TimePicker;
import java.util.Calendar;
public class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener {
private OnTimeSelectedListener onTimeSelectedListener;
public void setOnTimeSelectedListener(OnTimeSelectedListener onTimeSelectedListener) {
this.onTimeSelectedListener = onTimeSelectedListener;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Calendar c=Calendar.getInstance();
int hour=c.get(Calendar.HOUR_OF_DAY);
int minute=c.get(Calendar.MINUTE);
return new TimePickerDialog(getActivity(),this,hour,minute, DateFormat.is24HourFormat(getActivity()));
}
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
onTimeSelectedListener.onTimeSelected(hourOfDay, minute);
}
public interface OnTimeSelectedListener {
void onTimeSelected(int hourOfDay, int minute);
}
}
Upvotes: 1
Reputation: 544
I have personally tested it and it works. I hope it helps you!
MainActivity.java
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public class TimePickerFragment extends DialogFragment implements
TimePickerDialog.OnTimeSetListener
{
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
// Use the current time as the default values for the picker
final Calendar c = Calendar.getInstance();
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);
// Create a new instance of TimePickerDialog and return it
return new TimePickerDialog(getActivity(), this, hour, minute,
DateFormat.is24HourFormat(getActivity()));
}
public void onTimeSet(TimePicker view, int hourOfDay, int minute)
{
// Do something with the time chosen by the user
// Toast.makeText(MainActivity.this,String.valueOf(year) + "-" +
// String.valueOf(monthOfYear) + "-" +
// String.valueOf(dayOfMonth),Toast.LENGTH_LONG).show();
String am_pm = "";
Calendar datetime = Calendar.getInstance();
datetime.set(Calendar.HOUR_OF_DAY, hourOfDay);
datetime.set(Calendar.MINUTE, minute);
if (datetime.get(Calendar.AM_PM) == Calendar.AM)
am_pm = "AM";
else if (datetime.get(Calendar.AM_PM) == Calendar.PM)
am_pm = "PM";
String strHrsToShow = (datetime.get(Calendar.HOUR) == 0) ? "12"
: datetime.get(Calendar.HOUR) + "";
/*
* ((Button) getActivity().findViewById(R.id.btnEventStartTime))
* .setText(strHrsToShow + ":" + datetime.get(Calendar.MINUTE) + " "
* + am_pm);
*/
/*
* Toast.makeText(MainActivity.this, "The selected time is: " +
* String.valueOf(hourOfDay) + ":" + String.valueOf(minute) + " " +
* am_pm, Toast.LENGTH_SHORT).show();
*/
// This code converts 24 hour hand to 12 hour hand
Toast.makeText(
MainActivity.this,
"The selected time is: " + String.valueOf(strHrsToShow)
+ ":" + String.valueOf(minute) + " " + am_pm,
Toast.LENGTH_SHORT).show();
}
}
public void showTimePickerDialog(View v) {
DialogFragment newFragment = new TimePickerFragment();
newFragment.show(getFragmentManager(), "timePicker");
}
public class DatePickerFragment extends DialogFragment implements
OnDateSetListener {
@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);
int day = c.get(Calendar.DAY_OF_MONTH);
// Create a new instance of DatePickerDialog and return it
return new DatePickerDialog(getActivity(), this, year, month, day);
}
public void onDateSet(DatePicker view, int year, int month, int day) {
// Do something with the date chosen by the user
Toast.makeText(MainActivity.this, "The selected date is: " +
String.valueOf(day) + "." + String.valueOf(month) + "." +
String.valueOf(year), Toast.LENGTH_SHORT).show();
}
}
public void showDatePickerDialog(View v) {
DialogFragment newFragment = new DatePickerFragment();
newFragment.show(getFragmentManager(), "datePicker");
}
}
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#4863A0"
tools:context="com.nikhil.pickers.MainActivity" >
<Button
android:id="@+id/pickTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_margin="100dp"
android:onClick="showTimePickerDialog"
android:text="Pick Time" />
<Button
android:id="@+id/pickDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/pickTime"
android:layout_alignLeft="@id/pickTime"
android:onClick="showDatePickerDialog"
android:text="Pick Date" />
</RelativeLayout>
Upvotes: 2
Reputation: 2154
Try this:
MainActivity.java
public class MainActivity extends AppCompatActivity implements
DatePickerFragment.DatePickerListener, TimePickerFragment.TimePickerListener
{
private Calendar calendar;
FragmentManager fm;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
calendar = Calendar.getInstance();
fm = getSupportFragmentManager();
DatePickerFragment dateDialog = new DatePickerFragment();
dateDialog.show(fm, "fragment_date");
}
@Override
public void onDateSet(int year, int month, int day)
{
// Set selected year, month and day in calendar object
calendar.set(year, month, day);
// Start Time dialog
TimePickerFragment timeDialog = new TimePickerFragment();
timeDialog.show(fm, "fragment_time");
}
@Override
public void onTimeSet(int hourOfDay, int minute)
{
calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
calendar.set(Calendar.MINUTE, minute);
// Here, your calendar object is ready.
}
}
DatePickerFragment.java
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener
{
public interface DatePickerListener
{
public void onDateSet(int year, int month, int day);
}
private DatePickerListener listener;
@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);
int day = c.get(Calendar.DAY_OF_MONTH);
// Create a new instance of DatePickerDialog and return it
return new DatePickerDialog(getActivity(), this, year, month, day);
}
@Override
public void onAttach(Activity activity)
{
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
try {
listener = (DatePickerListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnHeadlineSelectedListener");
}
}
public void onDateSet(DatePicker view, int year, int month, int day)
{
listener.onDateSet(year, month, day);
}
}
TimePickerFragment.java
public class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener
{
public interface TimePickerListener
{
public void onTimeSet(int hourOfDay, int minute);
}
private TimePickerListener listener;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
final Calendar c=Calendar.getInstance();
int hour=c.get(Calendar.HOUR_OF_DAY);
int minute=c.get(Calendar.MINUTE);
return new TimePickerDialog(getActivity(),this,hour,minute, DateFormat.is24HourFormat(getActivity()));
}
@Override
public void onAttach(Activity activity)
{
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
try {
listener = (TimePickerListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnHeadlineSelectedListener");
}
}
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute)
{
listener.onTimeSet(hourOfDay, minute);
}
}
Hope this will solve your problem.
Upvotes: 2
Reputation: 2529
public class myDateObject {
int year;
int month;
int day;
public myDateObject(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
}
public class MainActivity extends AppCompatActivity{
MyDateObject myDate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
yourButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(myDate!=null){
FragmentTransaction ft =
getSupportFragmentManager().beginTransaction();
Fragment fragment = YourFragment.newInstance(myDate);
ft.replace(R.id.comments_fragment, fragment);
ft.commit();
}
}
});
}
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener
{
@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);
int day = c.get(Calendar.DAY_OF_MONTH);
// Create a new instance of DatePickerDialog and return it
return new DatePickerDialog(getActivity(), this, year, month, day);
}
public void onDateSet(DatePicker view, int year, int month, int day) {
myDate = new MyDateObject(year, month, day);
}
}
}
public class YourFragment extends Fragment {
public YourFragment newInstance(MyDateObject myDate) {
Bundle bundle = new Bundle();
YourFragment fragment = new YourFragment();
bundle.putInt("year", myDate.year);
bundle.putInt("month", myDate.month);
bundle.putInt("day", myDate.day);
fragment.setArguments(bundle);
return fragment;
}
}
Thats all, solve your question?
Upvotes: 1