Las entradas de AppCompatSpinner no abren TimePickerDialog al seleccionarla por segunda vez. Por favor ver detalles

Tengo las siguientes entradas de AppCompatSpinner :

 <string-array name="startTimeList"> <item>Now</item> <item>Pick a time..</item> </string-array> 

Al seleccionar Pick a time.. , se abre un TimePickerDialog y se le permite al usuario elegir una hora. Así es cómo:

 startTimeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { // startTimeString = adapterView.getItemAtPosition(i).toString(); DateFormat currentDateFormat = new SimpleDateFormat("HH:mm:ss"); userAvailableTimeInSF = currentDateFormat.format(new Date()); final TextView startTimeSpinnerTV = (TextView) adapterView.getSelectedView(); startTimeSpinnerTV.setText(userAvailableTimeInSF); switch (i) { case 0: userAvailableTimeInSF = currentDateFormat.format(new Date()); startTimeSpinnerTV.setText("Now"); break; default: final Calendar c = Calendar.getInstance(); mHour = c.get(Calendar.HOUR_OF_DAY); mMinute = c.get(Calendar.MINUTE); TimePickerDialog timePickerDialog = new TimePickerDialog(PostSportRequest.this, new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { Calendar date = Calendar.getInstance(); date.set(Calendar.HOUR_OF_DAY, hourOfDay); date.set(Calendar.MINUTE, minute); date.set(Calendar.AM_PM, date.get(Calendar.AM_PM)); showTime(hourOfDay, minute); userAvailableTimeInSF = new SimpleDateFormat("HH:mm:ss").format(date.getTime()); startTimeSpinnerTV.setText(userAvailableTimeAMPM); Toast.makeText(getBaseContext(), "userAvailableTimeInSF: " + userAvailableTimeInSF, Toast.LENGTH_SHORT).show(); } }, mHour, mMinute, false); timePickerDialog.show(); break; } } @Override public void onNothingSelected(AdapterView<?> adapterView) { } }); 

Al seleccionar Pick a time.. la primera vez, TimePickerDialog se abre con éxito y el tiempo elegido se muestra, pero cuando lo elijo de nuevo o haga clic en él de nuevo, no pasa nada!

¡No sé por qué!

Por favor, hágamelo saber cómo puedo obtener el TimePickerDialog abierto y eligió el tiempo no importa cuántas veces lo selecciono / haga clic en él.

Sigue estos pasos:

Crear una clase de hiladora personalizada

  import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.widget.AdapterView; import android.widget.Spinner; public class SpinnerOnSameSelection extends Spinner { OnItemSelectedListener listener; private AdapterView<?> lastParent; private View lastView; private long lastId; public SpinnerOnSameSelection(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub initlistner(); } @Override public void setSelection(int position) { if (position == getSelectedItemPosition() && listener != null) { listener.onItemSelected(lastParent, lastView, position, lastId); } else { super.setSelection(position); } } private void initlistner() { // TODO Auto-generated method stub super.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { // TODO Auto-generated method stub lastParent = parent; lastView = view; lastId = id; if (listener != null) { listener.onItemSelected(parent, view, position, id); } } @Override public void onNothingSelected(AdapterView<?> parent) { // TODO Auto-generated method stub if (listener != null) { listener.onNothingSelected(parent); } } }); } public void setOnItemSelectedEvenIfUnchangedListener( OnItemSelectedListener listener) { this.listener = listener; } } 

Crear onItemSelectedListener en su actividad

 private AdapterView.OnItemSelectedListener listener; listener = new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> adapterView, View arg1, int i, long arg3) { //startTimeString = adapterView.getItemAtPosition(i).toString(); DateFormat currentDateFormat = new SimpleDateFormat("HH:mm:ss"); userAvailableTimeInSF = currentDateFormat.format(new Date()); final TextView startTimeSpinnerTV = (TextView) adapterView.getSelectedView(); startTimeSpinnerTV.setText(userAvailableTimeInSF); switch (i) { case 0: // userAvailableTimeInSF = currentDateFormat.format(new Date()); startTimeSpinnerTV.setText("Now"); break; case 1: final Calendar c = Calendar.getInstance(); mHour = c.get(Calendar.HOUR_OF_DAY); mMinute = c.get(Calendar.MINUTE); TimePickerDialog timePickerDialog = new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { Calendar date = Calendar.getInstance(); date.set(Calendar.HOUR_OF_DAY, hourOfDay); date.set(Calendar.MINUTE, minute); date.set(Calendar.AM_PM, date.get(Calendar.AM_PM)); //showTime(hourOfDay, minute); /* userAvailableTimeInSF = new SimpleDateFormat("HH:mm:ss").format(date.getTime()); startTimeSpinnerTV.setText(userAvailableTimeAMPM);*/ Toast.makeText(getBaseContext(), "userAvailableTimeInSF: " + userAvailableTimeInSF, Toast.LENGTH_SHORT).show(); } }, mHour, mMinute, false); timePickerDialog.show(); break; } } @Override public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub } }; } 

Agregue el objeto de escucha al método de spinner personalizado

 SpinnerOnSameSelection startTimeSpinner; in onCreate(): startTimeSpinner = (SpinnerOnSameSelection) findViewById(R.id.idOfItemInXml); startTimeSpinner.setOnItemSelectedEvenIfUnchangedListener(listener); 

En tu archivo xml

 <your_package_name.SpinnerOnSameSelection android:id="@+id/startTimeSpinner" android:layout_width="match_parent" android:layout_height="40dp" android:layout_alignParentBottom="true" android:entries="@array/mList"> </your_package_name.SpinnerOnSameSelection> 

Spinner (o, en realidad, AdapterView, su superclase), activa OnItemSelectedListener sólo cuando cambia la selección.

Cuando su usuario selecciona "Pick a time …" Spinner asume que es una opción seleccionada, y no llamará más al oyente si se selecciona de nuevo. Sin embargo, puede notar que si selecciona "Pick a time …", entonces "Now" y luego "Pick a time …", aparecerá el diálogo.

Yo recomendaría contra el uso de Spinner en su caso (y haciendo una mierda extraña con la vista seleccionada). Simplemente puede realizar lo mismo con TextView que muestra la hora seleccionada y dos botones – uno para mostrar el diálogo y uno para restablecer el tiempo hasta ahora.

  • TimePicker hora no se actualiza después de cambiar a 24h
  • Android TimePickerDialog set max time
  • Obtener el valor del selector de fecha y hora a partir de un solo fragmento de diálogo y establecerlo en EditText
  • BetterPickers sin una biblioteca de soporte
  • TimePicker NullPointerException en ICS
  • Android: TimePicker setIs24HourView no funciona
  • Timepicker de los desarrolladores de Android no se permite estática
  • ¿Hay alguna forma de usar cancel en Android JellyBean TimePickerDialog?
  • ¿Es posible quitar el botón AM / PM de TimePicker?
  • ¿Cómo puedo agregar un nuevo botón en el widget del selector de fechas en android?
  • ¿Cómo configurar el TimePickerDialog a 24 horas?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.