2017-10-20 31 views
0

J'ai un champ pour choisir l'heure, grâce à un TimerPicker.Heures de bloc TimePicker

Cela fonctionne parfaitement.

Je cherche un moyen de restreindre ou de bloquer l'accès à certains moments.

Par exemple: Les champs d'ouverture et de fermeture, enregistré dans le FireStore (Firebase):

- Start time: 08:00 
- HourEnd: 7:00 p.m. 

Je dois bloquer les heures avant l'heure de début et les heures qui suivent l'heure de fin.

code TimePicker:

private void timePicker(){ 

     final Calendar c = Calendar.getInstance(); 
     mHour = c.get(Calendar.HOUR_OF_DAY); 
     mMinute = c.get(Calendar.MINUTE); 

     TimePickerDialog timePickerDialog = new TimePickerDialog(this, 
       new TimePickerDialog.OnTimeSetListener() { 

        @Override 
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 

         mHour = hourOfDay; 
         mMinute = minute; 


         /*Formato da hora*/ 
         String curTime = String.format("%02d:%02d", hourOfDay, minute); 

         mHora.setText(curTime); 
         mHoraString = curTime; 

        } 
       }, mHour, mMinute, true); 
     timePickerDialog.show(); 
} 
+0

Je crée toujours ma propre dialogue TimePicker personnalisé, que je crée à partir d'un TimePicker. De là, je prends l'Heure ou la Minute NumberPicker et je mets setMinValue et/ou setMaxValue. – Barns

+0

Comment pourrais-je le faire? Avez-vous un exemple en utilisant setMax/Min Value? @ Barns52 – TiagoIB

+0

J'ai posté un exemple d'une boîte de dialogue personnalisée TimePicker. – Barns

Répondre

0

J'espère que cela vous donne une idée de la façon de mettre en œuvre ce que vous recherchez. Je réalise que ce n'est pas la solution exacte que vous recherchez, mais c'est un début.

Ceci est le code que j'utilise pour mon TimePickerDialogFragment. Il est conçu pour afficher les minutes segment de la TimePicker pour certains intervalles (par exemple, 5, 10 ou 15 minutes.)

Dans l'activité qui appellera la TimePickerDialogFragment vous aurez besoin de mettre en œuvre l'auditeur de rappel:

implements TimePickerDialogFragment.EditTimeDialogListener 

Et vous appelez le dialogue comme ceci. Cet exemple fait les minutes toutes les 15 minutes:

TimePickerDialogFragment picker = TimePickerDialogFragment.newInstance("Select a Time", initialStartHour, 15); 
    picker.show(getFragmentManager(), "TimePickerDialogFragment"); 

initialStartHour est l'heure que je le sélecteur avec initialiser par exemple 10 pour 10 heures.

Le code de mon TimePickerDialogFragment est configuré pour définir les minutes par intervalles.

public class TimePickerDialogFragment extends DialogFragment { 

    private static final String ARG_TITLE = "title"; 
    private static final String ARG_START_HOUR = "startHour"; 
    private static final String ARG_MINUTE_INTERVAL = "minute_interval"; 

    private static final DecimalFormat FORMATTER = new DecimalFormat("00"); 
    NumberPicker minutePicker; 

    private String title; 
    private int startHour; 
    private int minuteInterval; 
    private String selectedTime; 

    private EditTimeDialogListener mListener; 

    public TimePickerDialogFragment() { 
    } 

    public static TimePickerDialogFragment newInstance(String title, int startHour, int minuteInterval) { 
     TimePickerDialogFragment fragment = new TimePickerDialogFragment(); 
     Bundle args = new Bundle(); 
     args.putString(ARG_TITLE, title); 
     args.putInt(ARG_START_HOUR, startHour); 
     args.putInt(ARG_MINUTE_INTERVAL, minuteInterval); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (getArguments() != null) { 
      title = getArguments().getString(ARG_TITLE); 
      startHour = getArguments().getInt(ARG_START_HOUR); 
      minuteInterval = getArguments().getInt(ARG_MINUTE_INTERVAL); 
     } 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle saveIntsanceState){ 

     final Context context = getActivity(); 

     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

     LayoutInflater inflater = getActivity().getLayoutInflater(); 

     View rootView = inflater.inflate(R.layout.fragment_time_picker_dialog, null, false); 
     final TimePicker picker = (TimePicker) rootView.findViewById(R.id.timePicker); 
     View minute = picker.findViewById(Resources.getSystem().getIdentifier("minute", "id", "android")); 
     setMinutePicker(minute); 

     //Block number keyboard 
     picker.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); 

     picker.setCurrentHour(startHour); 
     picker.setCurrentMinute(0); 
     // setHour is available for API level 23 and above!! 
//  picker.setHour(startHour); 

     final TextView tvTitle = (TextView)rootView.findViewById(R.id.tvTimePickerDialogTitle); 
     tvTitle.setText(title); 
//  picker.setSpinnersShown(false); 
//  picker.setCalendarViewShown(true); 

     builder.setView(rootView) 
     // setTitle is available for API level 23 and above!! 
//    .setTitle(title) 
       .setPositiveButton(R.string.ok_button_dialog_title, new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         // call the method on the parent activity when user click the positive button 

         Integer h = picker.getCurrentHour(); 
         Integer m = picker.getCurrentMinute() * minuteInterval; 

         String hh = h.toString(); 
         if(h < 10){ 
          hh = "0" + hh; 
         } 

         String mm = m.toString(); 
         if(m < 10){ 
          mm = "0" + mm; 
         } 

         selectedTime = hh + mm; 
         if(mListener == null) mListener = (EditTimeDialogListener) context; 
         mListener.onFinishTimeDialog(selectedTime); 
        } 
       }) 
       .setNegativeButton(R.string.cancel_button_dialog_title, new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         // call the method on the parent activity when user click the negative button 
        } 
       }); 
     return builder.create(); 
    } 

    private void setMinutePicker(View minute){ 
     int n = 60/minuteInterval; 
     String[] displayValues = new String[n]; 

     for(int i = 0; i < n; i++){ 
      displayValues[i] = FORMATTER.format(i*minuteInterval); 
     } 

     if((minute != null) && (minute instanceof NumberPicker)){ 
      minutePicker = (NumberPicker) minute; 

      minutePicker.setMinValue(0); 
      minutePicker.setMaxValue(n-1); 
      minutePicker.setDisplayedValues(displayValues); 
     } 
    } 


    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     try { 
      if(mListener == null) mListener = (EditTimeDialogListener) context; 
     } 
     catch (Exception ex){ 
      throw new RuntimeException(context.toString() 
        + " must implement OnFragmentInteractionListener"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     mListener = null; 
    } 

    public interface EditTimeDialogListener { 
     void onFinishTimeDialog(String selectedTime); 
    } 

} 

Maintenant, tout ce que vous avez à faire est d'extraire le temps sélectionné dans le fragment avec dans votre activité d'appel:

@Override 
public void onFinishTimeDialog(String selectedTime) { 
     // Now set the TextView text!! 
     mHora.setText(selectedTime); 
}