Estoy usando el ejemplo de google para insertar un selector de fechas dentro de mi aplicación a través de un dialogfragment

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 java experto). Diálogo y datepicker funciona bien y puedo registro de esa fecha está correctamente configurado, pero, ¿cómo puedo hacer para obtener una devolución de llamada ejecutado en la actividad de los padres?

Este es mi cuadro de Diálogo fragmento

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 que yo llamo el diálogo a partir 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 lugar de Registro.w? Supongo que es algo relacionado con el paso de una devolución de llamada como parámetro o algo así, pero la mayoría de las referencias que he encontrado en internet son acerca de las versiones anteriores sin dialogfragments

EDIT: no se si es importante pero la actividad principal, se declara como:

public class EditSessionActivity extends FragmentActivity {

SOLUCIÓN: gracias a su Lecho de usuario 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 de actividad de los padres 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);
    }
InformationsquelleAutor Gonzalo Cao | 2012-07-17

8 Comentarios

  1. 64

    Constructor fo DatePickerDialog toma DatePickerDialog.OnDateSetListener como segundo parámetro, así que tal vez debería implementar la interfaz en su actividad principal, EditSessionActivity (no en DatePickerFragment ) y cambiar esta línea:

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

    a esto:

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

    Y, a continuación, su actividad se parece a esto:

    public class EditSessionActivity extends FragmentActivity implements
            DatePickerDialog.OnDateSetListener{
    
        public void onDateSet(DatePicker view, int year, int month, int day) {
            //use date in your activity
        }
        ...
    }
    • que fue útil, voy a ampliar mi pregunta incluyendo su solución. Me gustaría recomendar a cada uno para leer acerca de la implementación de interfaces. docs.oracle.com/javase/tutorial/java/IandI/usinginterface.html
    • En lugar de convertir a EditSessionActivity, supongo que te refieres a fundición para OnDateSetListener.
    • Sí, tienes razón, va a ser arrojado a OnDateSetListener de todos modos como EditSessionActivity implementa OnDateSetListener pero tu sugerencia va a hacer que el código sea más claro.
    • ¿Qué hacer si usted tiene dos o más campos de fecha que debe ser llenado mediante DatePickerDialog? Se puede discriminar en onDateSet(), para que el campo de la DatePickerDialog se llama?
    • Yo ese caso yo suelo aplicar personalizado DialogFragment que toma algo de la bandera que me permite más tarde a discriminar por el campo que se muestra. Yo también la necesidad de escucha personalizada para que. Mira esta esencia por ejemplo, la ejecución de gist.github.com/lecho/9305505. Es el momento selector pero selector de fecha sería muy similar.
    • Muchas gracias! funciona bien!

  2. 25

    I simple anular onDateSet en el selector de fecha de creación de mi clase que muestra un selector de fecha.
    Véase el código de abajo:

      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");
        }
      };
     } 
    • Gracias, Esto es fácil en el caso de múltiples campos de fecha
    • Gracias, es la solución más sencilla que he visto hasta ahora!
    • WOW eres una leyenda.
    • Cuando lo intento , estoy recibiendo este error de Fragmentos deben ser estáticos tales que se puede volver a instancia por el sistema, y las clases anónimas no son estáticos
  3. 13

    El problema también puede resolverse sin necesidad de mover el onDateSet método para la actividad de los padres. Usted sólo tiene que decirle a la DatePickerFragment donde buscar para 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 he cambiado el destino de la fundición de EditText a TextView. De esta manera, usted puede volver a utilizar su aplicación para los diferentes tipos de vistas, no sólo para un EditText.

  4. 9

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

    return new DatePickerDialog(getActivity(), (EditSessionActivity)getActivity(), año, mes, día);

    deberá devolverla en un modo más genérico

    return new DatePickerDialog(getActivity(), (OnDateSetListener)getActivity(), año, mes, día);

    sólo asegúrese de que su actividad implementa OnDateSetListener interfaz y reemplazar la función onDateSet

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

    Leszek la respuesta de obras, pero no se si el Diálogo se inicia desde otro Fragmento. En ese caso, usted necesita para utilizar setTargetFragment() en el código que crea el cuadro de diálogo y getTargetFragment() en el cuadro de diálogo de código.

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

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

    En el DialogFragment código:

    @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);
    }
  7. 2

    En caso de tener que devolver un resultado a un Fragmento, pero no una Actividad, aquí es 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;
    }
    }

    Luego usarlo sólo en un Fragmento o de 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);
    • Este se ve bien, excepto que me estoy poniendo un problema con .setListener(this) cuando se llama en mi fragmento. Puedo poner ese código en onClickListener para el editText nombre bday donde quiero mostrar la fecha seleccionada utilizando setText. ¿Alguna idea de cómo debería hacerlo usando su solución?
    • si desea utilizar dentro de la haga clic en el oyente y DatePickerDialog.OnDateSetListener es implementado por un Fragmento, usted debe hacer setListener(YourFragment.este). De lo contrario, esto se refiere a la clicklistener sí mismo
  8. 0

    He tenido un problema similar a este, pero mi selector de fecha se iniciaron a partir de un fragmento de diálogo dentro de otro fragmento. Esto hizo muy difícil jugar con las devoluciones de llamada, porque quieren volver a la Actividad Principal y quería que los datos para volver al cuadro de diálogo anterior fragmento.

    Inicialmente, he pasado a la nueva fecha de los valores a la Actividad Principal (usando el OnDateSetListener) y se va a obtener a ellos mediante el cuadro de diálogo que inició el selector de fecha, pero no hay eventos del ciclo de vida activa en ese diálogo cuando el selector de fecha de cierre.

    El resultado me vino a la era en onDismiss en el selector de fecha, una instancia de un nuevo fragmento de diálogo, llame a un conjunto de resultados método y, a continuación, ejecutarlo. Por supuesto, para esto usted necesita para asegurarse de que el fragmento anterior es despedido cuando se inicia el selector de fecha.

    Este es el dialogFragment que se llama el 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;
    }
    }
    • Muy creativo, pero hay una forma más fácil: ver mi respuesta.

Dejar respuesta

Please enter your comment!
Please enter your name here