I\'m using the google example to insert a datepicker inside my app using a dialogfragment
http://developer.android.com/guide/topics/ui/controls/pickers.html
But
In case you have to return a result to a Fragment, but not an Activity, here is a complete solution:
public class DatePickerDialogFragment extends DialogFragment {
private static final String ARGUMENT_YEAR = "ARGUMENT_YEAR";
private static final String ARGUMENT_MONTH = "ARGUMENT_MONTH";
private static final String ARGUMENT_DAY = "ARGUMENT_DAY";
private DatePickerDialog.OnDateSetListener listener;
private int year;
private int month;
private int dayOfMonth;
public static DatePickerDialogFragment newInstance(final int year, final int month, final int dayOfMonth) {
final DatePickerDialogFragment df = new DatePickerDialogFragment();
final Bundle args = new Bundle();
args.putInt(ARGUMENT_YEAR, year);
args.putInt(ARGUMENT_MONTH, month);
args.putInt(ARGUMENT_DAY, dayOfMonth);
df.setArguments(args);
return df;
}
@Override
public void onCreate(@Nullable final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
retrieveArguments();
}
private void retrieveArguments() {
final Bundle args = getArguments();
if (args != null) {
year = args.getInt(ARGUMENT_YEAR);
month = args.getInt(ARGUMENT_MONTH);
dayOfMonth = args.getInt(ARGUMENT_DAY);
}
}
@Override
public Dialog onCreateDialog(final Bundle savedInstanceState) {
return new DatePickerDialog(getContext(), this.listener, this.year, this.month, this.dayOfMonth);
}
public void setListener(final DatePickerDialog.OnDateSetListener listener) {
this.listener = listener;
}
}
Then just use it in a Fragment or in an Activity:
final Calendar c = Calendar.getInstance();
DatePickerDialogFragment datePicker = DatePickerDialogFragment.newInstance(
c.get(Calendar.YEAR),
c.get(Calendar.MONTH),
c.get(Calendar.DAY_OF_MONTH));
datePicker.setListener(this);
datePicker.show(getChildFragmentManager(), null);
I simple override onDateSet in date picker creation in my class that shows a date picker. See code below:
private OnClickListener onDateClicked() {
return new OnClickListener() {
@Override
public void onClick(View v) {
DialogFragment newFragment = new DatePickerFragment() {
@Override
public void onDateSet(DatePicker view, int year, int month, int day) {
salePaymentCustomView.setBtDateText("" + day + "/" + month+1 + "/" + year);
}
};
newFragment.show(getActivity().getSupportFragmentManager(), "datePicker");
}
};
}
public void onDate(View view) {
DialogFragment fragment = new SelectDateFragment();
fragment.show(getFragmentManager(), "Date Picker");
}
// @SuppressLint("NewApi")
class SelectDateFragment extends DialogFragment implements
DatePickerDialog.OnDateSetListener {
public Dialog onCreateDialog(Bundle savedInstanceState) {
System.out.println("entrering on create dialog");;
return new DatePickerDialog(getActivity(), this, mYear, mMonth,
mDay);//it will return dialog setting date with mYera,MMonth and MDay
}
@Override
public void onDateSet(android.widget.DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
System.out.println("year=" + year + "day=" + dayOfMonth + "month="
+ monthOfYear);
mYear=year;
mMonth=monthOfYear;
mDay=dayOfMonth;
onPopulateSet(year, monthOfYear + 1, dayOfMonth);
}
// set the selected date in the edit text
private void onPopulateSet(int year, int i, int dayOfMonth) {
EditText et_setDate;
et_setDate = (EditText) findViewById(R.id.register_et_dob);//register_et_dob:-id name of the edit text
et_setDate.setText(dayOfMonth + "/" + i + "/" + year);
System.out.println("enetring on populate Set");
}
The problem can also be solved without moving the onDateSet
method to the parent activity. You just have to tell the DatePickerFragment
where to search for the view:
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) {
// do some stuff for example write on log and update TextField on activity
Log.w("DatePicker","Date = " + year);
((TextView) getActivity().findViewById(R.id.tf_date)).setText("Date = " + year);
}
}
I also changed the target of the cast from EditText
to TextView
. This way, you can reuse your implementation for different kinds of views, not only for an EditText
.
i have one correction to the above answer. instead of return the DatePickerDialog like this
return new DatePickerDialog(getActivity(), (EditSessionActivity)getActivity(), year, month, day);
you should return it in a more generic way
return new DatePickerDialog(getActivity(), (OnDateSetListener)getActivity(), year, month, day);
just make sure your activity implements OnDateSetListener interface and override the function onDateSet
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,int dayOfMonth)
Constructor fo DatePickerDialog
takes DatePickerDialog.OnDateSetListener
as second parameter, so maybe you should implement that interface in your parent activity EditSessionActivity
(not in DatePickerFragment
) and change this line:
return new DatePickerDialog(getActivity(), this, year, month, day);
into this:
return new DatePickerDialog(getActivity(), (EditSessionActivity)getActivity(), year, month, day);
And then your activity should looks like this:
public class EditSessionActivity extends FragmentActivity implements
DatePickerDialog.OnDateSetListener{
public void onDateSet(DatePicker view, int year, int month, int day) {
//use date in your activity
}
...
}