¿Cómo crear los diálogos datePicker y timePicker en la clase de fragmento?

Quiero saber si hay alguna manera de crear un datePicker en un fragmento. Estoy creando uno, la actividad regular puede y me da error de syntax. ¿Cuál es la forma correcta de hacer esto?

Lo más probable es que necesite usar un DialogFragment. Encontré algo de información aquí:

Mostrar el diálogo de fragmento?

y también una gran ayuda aquí:

https://github.com/commonsguy/cw-advandroid/blob/master/Honeycomb/FeedFragments/src/com/commonsware/android/feedfrags/AddFeedDialogFragment.java

Esto debería ayudarte a seguir tu camino, estoy haciendo esto mismo ahora. Aunque dentro del código de ejemplo no uso un generador y en su lugar solo devuelvo:

return new DatePickerDialog(getActivity(), mDateSetListener, mYear, mMonth, mDay); 

Esto parece funcionar … aunque todavía no puedo descifrar cómo actualizar el texto en el fragmento que llama a este DialogFragment. Pensé que esto funcionaría y no:

  public void updateDisplay() { //update our button text from the calling fragment, this isn't quite working //doesn't crash just doesn't update...must be missing something. View v=getActivity() .getLayoutInflater() .inflate(R.layout.session_edits, null); Button sessionDate = (Button)v.findViewById(R.id.sessionPickDate); sessionDate.setText(new StringBuilder() .append(mMonth+1).append("-").append(mDay).append("-").append(mYear).append(" ")); } 

Ampliando la respuesta de Codejoy:

Aquí está mi clase DatePickerDialogFragment:

 public class DatePickerDialogFragment extends DialogFragment { private Fragment mFragment; public DatePickerDialogFragment(Fragment callback) { mFragment = callback; } public Dialog onCreateDialog(Bundle savedInstanceState) { return new DatePickerDialog(getActivity(), (OnDateSetListener) mFragment, 1980, 7, 16); } } 

(Tenga en cuenta que el constructor acepta el fragmento que está usando este diálogo, y que usamos esta referencia para el campo de escucha de callback para DatePickerDialog)

Mi fragmento entonces simplemente implementa onDateSetListener:

 public class SignupFragment extends Fragment implements OnDateSetListener { ... public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { // do stuff with the date the user selected } } 

… y luego muestro el diálogo de mi Fragmento así:

 FragmentTransaction ft = getFragmentManager().beginTransaction(); DialogFragment newFragment = new DatePickerDialogFragment(this); newFragment.show(ft, "dialog"); 

No estoy seguro de si esta es la mejor manera de hacerlo, pero parece funcionar bien.

Aunque las respuestas anteriores podrían funcionar, creo que tengo una solución mucho más fácil:

 DatePickerDialog dialog = new DatePickerDialog(getActivity(), datePickerListener, 2000, 1,1); dialog.show(); 

Donde datePickerListerener es algo como esto:

 private DatePickerDialog.OnDateSetListener datePickerListener = new DatePickerDialog.OnDateSetListener() { // when dialog box is closed, below method will be called. public void onDateSet(DatePicker view, int selectedYear, int selectedMonth, int selectedDay) { //Do whatever you want } }; 

Los informes anteriores explican lo suficiente, pero aquí es cómo cambié la vista en el método DateDetSet de DialogFragment.

Puede pasar la vista que desea cambiar al constructer de clase que extiende DialogFragment. Luego llame al método setText en el método DateDateSet de la clase. Aquí está el código:

 public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { public EditText activity_edittext; public DatePickerFragment(EditText edit_text) { activity_edittext = edit_text; } @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 month, int day) { activity_edittext.setText(String.valueOf(month + 1 ) + "/" + String.valueOf(day) + "/" + String.valueOf(year)); } } 

Entonces puedes mostrar tu fragmento así:

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

Establezca este método en el método ClickClick de EditText que desea cambiar. Me gusta esto:

    

Aquí hay un fragmento en el que quisiera utilizar el marcador de fecha en un fragmento:

 private Callbacks mCallbacks; private String tag; /** * A callback interface that all fragments/activities containing this fragment must * implement. This mechanism allows activities to be notified of item * selections. */ public interface Callbacks { /** * Callback for when an item has been selected. */ public void onSelected(Date date, String tag); } public static DatePickerFragment newInstance(Fragment fragment, Date date, String tag) { DatePickerFragment dateFragment = new DatePickerFragment(); Calendar c = Calendar.getInstance(); if (date != null) { c.setTime(date); } dateFragment.setYear(c.get(Calendar.YEAR)); dateFragment.setMonth(c.get(Calendar.MONTH)); dateFragment.setDay(c.get(Calendar.DAY_OF_MONTH)); dateFragment.setmCallbacks((Callbacks) fragment); dateFragment.setTag(tag); return dateFragment; } public void onDateSet(DatePicker view, int year, int month, int day) { // Do something with the date chosen by the user Calendar cal = Calendar.getInstance(); cal.set(year, month, day); date = new Date(cal.getTime().getTime()); setType(1); mCallbacks.onSelected(date,tag); } 

y en tu fragmento:

  public class DetailFragment extends Fragment implements DatePickerFragment.Callbacks { 

. . .

  private void startDatePicker(String tag) { DialogFragment newFragment = DatePickerFragment.newInstance(this, invoiceModell.getInvoice().getInvoiceDate(), tag); newFragment.show(getActivity().getSupportFragmentManager(), "datePicker"); } @Override public void onSelected(Date date, String tag) { if (tag.equals(FIRSTDATE)) invoiceModell.getInvoice().setInvoiceDate(date); else if (tag.equals(SECONDDATE)) invoiceModell.getInvoice().setDueDate(date); }