Obtener la fecha de datepicker usando dialogfragment

Estoy usando el ejemplo de google para insertar un marcador de fecha dentro de mi aplicación usando un fragmento de diálogo
http://developer.android.com/guide/topics/ui/controls/pickers.html

Pero no estoy seguro de cómo obtener la fecha después de configurarlo (no experto de Java). Dialog y datepicker se ejecutan correctamente y puedo registrar esa fecha correctamente establecida pero, ¿cómo puedo hacer para que se ejecute una callback en la actividad principal?

Este es mi fragmento de diálogo

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) { **Log.w("DatePicker","Date = " + year);** } } 

… y llamo al diálogo de mi actividad con …

 public void showDatePickerDialog(View v) { DialogFragment newFragment = new DatePickerFragment(); newFragment.show(getSupportFragmentManager(), "datePicker"); } 

¿Cuál es la forma correcta de llamar a un método en mi actividad principal en lugar de Log.w? Supongo que eso está relacionado con pasar una callback como parámetro o algo, pero la mayoría de las referencias que encontré en Internet se refieren a versiones anteriores sin fragmentos de diálogo

EDITAR: no estoy seguro de si es importante, pero la actividad de los padres se declara como:

 public class EditSessionActivity extends FragmentActivity { 

SOLUCIÓN: gracias al usuario de Lecho, esta es la manera de hacerlo

DatePickerFragmennt.class

 public class DatePickerFragment extends DialogFragment{ @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(), (EditSessionActivity)getActivity(), year, month, day); } } 

… y la actividad principal EditSessionActivity.class …

 public class EditSessionActivity extends FragmentActivity implements OnDateSetListener { ... @Override 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); ((EditText) findViewById(R.id.tf_date)).setText("Date = " + year); } 

El constructor de DatePickerDialog toma DatePickerDialog.OnDateSetListener como segundo parámetro, por lo que tal vez debería implementar esa interfaz en su actividad principal EditSessionActivity (no en DatePickerFragment ) y cambiar esta línea:

 return new DatePickerDialog(getActivity(), this, year, month, day); 

dentro de esto:

 return new DatePickerDialog(getActivity(), (EditSessionActivity)getActivity(), year, month, day); 

Y entonces tu actividad debería verse así:

 public class EditSessionActivity extends FragmentActivity implements DatePickerDialog.OnDateSetListener{ public void onDateSet(DatePicker view, int year, int month, int day) { //use date in your activity } ... } 

Simplemente anulo onDateSet en la creación del selector de fecha en mi clase que muestra un selector de fecha. Vea el código a continuación:

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

El problema también se puede resolver sin mover el método onDateSet a la actividad principal. Solo tiene que decirle al DatePickerFragment dónde buscar la vista:

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

También cambié el objective del elenco de EditText a TextView . De esta forma, puede reutilizar su implementación para diferentes tipos de vistas, no solo para un EditText .

tengo una corrección a la respuesta anterior. en lugar de devolver el DatePickerDialog como este

devolver nuevo DatePickerDialog (getActivity (), (EditSessionActivity) getActivity (), año, mes, día);

deberías devolverlo de una manera más genérica

devolver nuevo DatePickerDialog (getActivity (), (OnDateSetListener) getActivity (), año, mes, día);

solo asegúrese de que su actividad implemente la interfaz OnDateSetListener y anule la función onDateSet

 @Override public void onDateSet(DatePicker view, int year, int monthOfYear,int dayOfMonth) 
 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"); } 

La respuesta de Leszek funciona, pero no si el Diálogo se inicia desde otro Fragmento. En ese caso, debe usar setTargetFragment() en el código que crea el diálogo y getTargetFragment() en el código de diálogo.

En el código que crea el diálogo:

 DialogFragment dialogFragment = new YourDialogFragment(); dialogFragment.setTargetFragment(YourParentFragment.this, 0); dialogFragment.show(getFragmentManager(), "mydialog"); 

En el código DialogFragment:

 @Override public Dialog onCreateDialog(Bundle savedInstanceState) { DatePickerDialog.OnDateSetListener listener = new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { YourParentFragment parentFragment = (YourParentFragment) getTargetFragment(); // Manipulate the parent fragment // ... } }; // Get the initial date // ... return new DatePickerDialog(getActivity(), listener, year, month, day); } 

Tuve un problema similar a esto, pero mi selector de fecha estaba siendo lanzado desde un fragmento de diálogo dentro de otro fragmento. Esto hizo que sea muy difícil jugar con las devoluciones de llamada, porque quieren volver a la actividad principal y quería que los datos volvieran al fragmento de diálogo anterior.

Inicialmente, pasé los nuevos valores de fecha a la actividad principal (usando OnDateSetListener) y los iba a obtener usando el diálogo que inició el selector de fecha, pero no hay eventos de ciclo de vida activados en ese cuadro de diálogo cuando se cierra el marcador de fecha.

El resultado que obtuve fue en Descartar en el selector de fecha, crear una instancia de un nuevo fragmento de diálogo, llamar a un método de resultados y luego iniciarlo. Por supuesto, para esto necesita asegurarse de que el fragmento anterior se descarta cuando se inicia el selector de fecha.

Este es el cuadro de diálogo Fragmento que llamó al selector de fecha

 public class NewTrialDialogFragment extends DialogFragment { public final String LOG_TAG = "NewTrialDialog Fragment"; Button startDateButton; Integer newYear, newMonth, newDay; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.dialog_new_trial, container, false); getDialog().setTitle("Dialog New Trial"); startDateButton = (Button) rootView.findViewById(R.id.button_start_date); startDateButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showDatePickerDialog(v); } }); //If you exit the datepicker without choosing anything, it returns zeros if (newYear != null && newMonth != null && newDay != null && newYear != 0) { startDateButton.setText(newYear + " " + newMonth + " " + newDay); }else{ startDateButton.setText("Select Start Date"); } return rootView; } public void showDatePickerDialog(View v) { TrialDatePickerDialog newDialog = new TrialDatePickerDialog(); newDialog.show(getActivity().getSupportFragmentManager(), "datePicker"); this.dismiss(); } public void setDates(int year, int month, int day){ newYear = year; newMonth = month; newDay = day; }} 

Y el selector de fecha

 public class TrialDatePickerDialog extends DialogFragment implements DatePickerDialog.OnDateSetListener { private final String LOG_TAG = "TrialDatePickerDialog"; int newYear, newMonth, newDay; @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 TrialDatePickerDialog and return it return new DatePickerDialog(getActivity(), this , year, month, day); } @Override public void onDismiss(DialogInterface dialog) { super.onDismiss(dialog); FragmentManager fm = getActivity().getSupportFragmentManager(); NewTrialDialogFragment newTrialDialogFragment = new NewTrialDialogFragment(); newTrialDialogFragment.setDates(newYear, newMonth, newDay); newTrialDialogFragment.show(fm, "new_trial_dialog"); } @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { newYear = year; newMonth = monthOfYear; newDay = dayOfMonth; } } 

En caso de que deba devolver un resultado a un Fragmento, pero no a una Actividad, aquí hay una solución completa:

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

Entonces solo úsala en un Fragmento o en una Actividad:

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