Android: utiliza un datepicker y timepicker desde dentro de un diálogo

Estoy enfrentando un problema que no sé cómo solucionar … Tengo una actividad, cuando hago clic en un elemento particular del menú vinculado a esta actividad, se muestra un cuadro de diálogo y se utiliza para agregar un elemento. Este elemento tiene una fecha y una hora, pero no logro tener un DatePicker y TimePicker dentro de este diálogo. También intento pasar la actividad al diálogo y usar esto para mostrar el datepicker., Pero eso no funciona. Antes de esto, manejé la creación de tales artículos dentro de otra Actividad. En este caso, funciona bien. Pero encontré el Dialog más sexy … 🙂 ¿Tienes alguna idea? Espero no estoy demasiado confundido ….. gracias mucho, Luc

Edito esta publicación para compartir el código con el que tengo dificultades.

Tengo una clase básica del diálogo que intentó utilizar DatePicker y TimePicker. Básicamente, Eclipse se queja de que:

  • El showDialog no está definido para View.OnClickListener ()
  • Método onCreateDialog: El método onCreateDialog (int) de tipo EventCreateDialog debe reemplazar o implementar un método supertipo
  • DatePickerDialog no está definido (ya que esto no es una acitvidad)

Todo esto funciona desde dentro de una Actividad pero no puedo tenerla trabajando desde un Diálogo.

Muchas gracias, Luc

  Paquete com.android.myapp;
 Importar
 Public class TestDialog extends Dialog implements android.view.View.OnClickListener {
 Private TextView mDateDisplay;
 Botón privado mPickDate;
 Botón privado mPickTime;
 Privado int mYear;
 Privado int mMonth;
 Private int mDay;
 Int privado mHour;
 Privado int mMinute;
 Static final int DATE_DIALOG_ID = 0;
 Static final int TIME_DIALOG_ID = 1;

 Private Botón mButton_ok;

 Botón privado mButton_ko;

 ReadyListener readyListener para uso privado;

 Contexto contexto privado;    

     Public TestDialog (Contexto contextual, ReadyListener readyListener) {
         Super (contexto);
         This.context = context;
         This.readyListener = readyListener;
     }

     @Anular
     Protected void onCreate (Paquete savedInstanceState) {
         Super.onCreate (savedInstanceState);
         SetContentView (R.layout.event_create);          

         MButton_ok = (Botón) findViewById (R.id.button_ok);
         MButton_ko = (Botón) findViewById (R.id.button_ko);

         // Añadir oyentes
         MButton_ok.setOnClickListener (este);
         MButton_ko.setOnClickListener (este);

             MDateDisplay = (TextView) findViewById (R.id.dateDisplay);
             MPickDate = (Botón) findViewById (R.id.pickDate);
             MPickTime = (Botón) findViewById (R.id.pickTime);
             // agrega un oyente de clics al botón
             MPickDate.setOnClickListener (new View.OnClickListener () {
                 Public void onClick (Ver v) {showDialog (DATE_DIALOG_ID);  }
             });
             MPickTime.setOnClickListener (new View.OnClickListener () {
                 Public void onClick (Ver v) {showDialog (TIME_DIALOG_ID);  }
             });
             // obtener la fecha actual
             Calendario final c = Calendar.getInstance ();
             MYear = c.get (Calendar.YEAR);
             MMonth = c.get (Calendar.MONTH);
             MDay = c.get (Calendar.DAY_OF_MONTH);
             MHour = c.get (Calendar.HOUR_OF_DAY);
             MMinute = c.get (Calendar.MINUTE);
             UpdateDisplay ();
     }   

         @Anular
         Protegido Dialog onCreateDialog (int id) {
             Switch (id) {
             Case DATE_DIALOG_ID:
                 Return nuevo DatePickerDialog (esto, mDateSetListener, mYear, mMonth, mDay);
             Caso TIME_DIALOG_ID:
                 Devuelve nuevo TimePickerDialog (esto, mTimeSetListener, mHour, mMinute, false);
             }
             Return null;
         }
         Private void updateDisplay () {
             MDateDisplay.setText (
                 Nuevo StringBuilder ()
                     // El mes es 0 basado para agregar 1
                     .append (mMonth + 1) .append ("-")
                     .append (mDay) .append ("-")
                     .append (mYear) .append ("")
                     .append (pad (mHour)). Append (":")
                    .append (almohadilla (mMinute)));
         }

         // la devolución de llamada recibida cuando el usuario "fija" la fecha en el diálogo
         Private DatePickerDialog.OnDateSetListener mDateSetListener =
             Nuevo DatePickerDialog.OnDateSetListener () {
                 Public void onDateSet (vista de DatePicker, int año, int monthOfYear, int dayOfMonth) {
                     MYear = año;
                     MMonth = monthOfYear;
                     MDay = dayOfMonth;
                     UpdateDisplay ();
                 }
         };

         Privado TimePickerDialog.OnTimeSetListener mTimeSetListener =
             Nuevo TimePickerDialog.OnTimeSetListener () {
                 Public void onTimeSet (vista TimePicker, int hourOfDay, int minuto) {
                     MHour = hourOfDay;
                     MMinuto = minuto;
                     UpdateDisplay ();
                 }
         };

         Private static String pad (int c) {
             Si (c> = 10)
                 Return String.valueOf (c);
             más
                 Devuelve "0" + String.valueOf (c);
         }

     Interfaz pública ReadyListener { 
         Public void ready (MyObj myObj); 
     } 

      @Anular
         Public void onClick (Ver v) {
         If (v == mButton_ok) {
             // Hacer cosas....

         }


         If (v == mButton_ko) {
             despedir();
         }
      }
 }

Esto es lo que tengo que funciona:

public class EditRecordDialog extends Dialog { protected Context _context; private Record _record; public EditRecordDialog( Context context, Record record ) { super( context ); _context = context; _record = record Button buttonDate; buttonDate.setText( _record.getRecordDate() ); // returns 'mm-dd-yy' } // EditRecordDialog // showDatePickerDialog ++++++++++++++++++++++++++++++++++++++++++++++++++++++ private void showDatePickerDialog( View view ) { String dateString; int year, month, day; dateString = buttonDate.getText().toString(); month = Integer.valueOf( dateString.substring( 0, 2 ) ) - 1; // month is zero based day = Integer.valueOf( dateString.substring( 3, 5 ) ); year = Integer.valueOf( "20" + dateString.substring( 6, 8 ) ); DatePickerDialog dpd = new DatePickerDialog( _context, dateSetListener, year, month, day ); dpd.show(); } // showDatePickerDialog ---------------------------------------------------- // OnDateSetListener +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet( DatePicker view, int year, int month, int day ) { buttonDate.setText( ConfigObjectDAO.formatDate( (month+1) + "-" + day + "-" + year ) ); } // onDateSet }; // OnDateSetListener ------------------------------------------------------ } 

PickerViewSample.java

 package com.sai.samples.views; import java.util.Calendar; import android.app.Activity; import android.app.DatePickerDialog; import android.app.Dialog; import android.app.TimePickerDialog; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.DatePicker; import android.widget.TextView; import android.widget.TimePicker; public class PickerViewSample extends Activity { static final int DATE_DIALOG_ID = 1; static final int TIME_DIALOG_ID = 2; private TextView dateDisplay; private Button pickDate; private int year, month, day; private TextView timeDisplay; private Button pickTime; private int hours, min; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); dateDisplay = (TextView)findViewById(R.id.TextView01); pickDate = (Button)findViewById(R.id.Button01); pickDate.setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { showDialog(DATE_DIALOG_ID); } }); final Calendar cal = Calendar.getInstance(); year = cal.get(Calendar.YEAR); month = cal.get(Calendar.MONTH); day = cal.get(Calendar.DAY_OF_MONTH); updateDate(); timeDisplay = (TextView)findViewById(R.id.TextView02); pickTime = (Button)findViewById(R.id.Button02); pickTime.setOnClickListener( new OnClickListener () { @Override public void onClick(View v) { showDialog(TIME_DIALOG_ID); } }); hours = cal.get(Calendar.HOUR); min = cal.get(Calendar.MINUTE); updateTime(); } private void updateTime() { timeDisplay.setText(new StringBuilder().append(hours).append(':') .append(min)); } private void updateDate() { dateDisplay.setText(new StringBuilder().append(day).append('-') .append(month + 1).append('-').append(year)); } private DatePickerDialog.OnDateSetListener dateListener = new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int yr, int monthOfYear, int dayOfMonth) { year = yr; month = monthOfYear; day = dayOfMonth; updateDate(); } }; private TimePickerDialog.OnTimeSetListener timeListener = new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { hours = hourOfDay; min = minute; updateTime(); } }; protected Dialog onCreateDialog(int id){ switch(id) { case DATE_DIALOG_ID: return new DatePickerDialog(this, dateListener, year, month, day); case TIME_DIALOG_ID: return new TimePickerDialog(this, timeListener, hours, min, false); } return null; } } 

Main.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:text="@string/date_text" android:id="@+id/TextView01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="26px" android:typeface="sans"></TextView> <Button android:text="@string/date_button" android:id="@+id/Button01" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> <TextView android:text="@string/time_text" android:id="@+id/TextView02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="26px" android:typeface="sans"></TextView> <Button android:text="@string/time_button" android:id="@+id/Button02" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> </LinearLayout> 

Datepickerlayout.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> <DatePicker android:id="@+id/DatePicker01" android:layout_width="wrap_content" android:layout_height="wrap_content"></DatePicker> </LinearLayout> 

Declarar variables en global como:

 private int year, month, day, Hour, Minute; public static final int DATE_PICKER_ID = 1111; 

En onCreate ()

 // Get current date by calender final Calendar c = Calendar.getInstance(); year = c.get(Calendar.YEAR); month = c.get(Calendar.MONTH); day = c.get(Calendar.DAY_OF_MONTH); 

Llamada datepicker desde el botón de clic

 showDialog(Constant.DATE_PICKER_ID); 

Métodos:

  @Override protected Dialog onCreateDialog(int id) { switch (id) { case Constant.DATE_PICKER_ID: // open datepicker dialog. // set date picker for current date // add pickerListener listner to date picker return new DatePickerDialog(this, pickerListener, year, month, day); case Constant.TIME_PICKER_ID: return new TimePickerDialog(this, timeSetListener, Hour, Minute, false); } return null; } private DatePickerDialog.OnDateSetListener pickerListener = new DatePickerDialog.OnDateSetListener() { // when dialog box is closed, below method will be called. @Override public void onDateSet(DatePicker view, int selectedYear, int selectedMonth, int selectedDay) { year = selectedYear; month = selectedMonth; day = selectedDay; text_date.setText(new StringBuilder().append(month + 1) .append("/").append(day).append("/").append(year) .append(" ")); } }; 

Esto debería funcionar:

 mPickDate.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { context.showDialog(DATE_DIALOG_ID); } }); 

OnCreateDialog sólo se puede llamar desde dentro de una actividad

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.