2016-03-17 2 views
1

Последние несколько дней я экспериментировал со сборщиками времени в Xamarin.Android. Я следовал этим двум ссылкам:Как обновить несколько сборщиков времени отдельно

How to update text-view with multiple datepickers

http://blog.falafel.com/31-days-of-xamarin-android-day-15-controls-datetime-controls/

Но теперь я немного застрял.

У меня есть два сборщика времени в той же деятельности. Я хочу выбрать время начала и время окончания. Но когда я устанавливаю время одного из таймера в своей деятельности, он автоматически обновляет другой.

То, что я хочу, устанавливается один раз, не обновляя другой. Ниже то, что я пробовал:

ReservationHoursActivity.cs

public class ReservationHoursActivity : Activity, TimePickerDialog.IOnTimeSetListener 
{ 
    private TextView time_display_Start; 
    private Button pick_button_Start; 
    private TextView time_display_End; 
    private Button pick_button_End, submitButtonMyslot; 

    private int hour; 
    private int minute; 

    const int START_TIME_DIALOG_ID = 0; 
    const int END_TIME_DIALOG_ID = 1; 

    const int TIME_PICKER_TO = 0; 
    const int TIME_PICKER_FROM = 1; 

    protected override void OnCreate (Bundle savedInstanceState) 
    { 
     base.OnCreate (savedInstanceState); 
     SetContentView (Resource.Layout.ReservationHoursLayout); 

     time_display_Start = FindViewById<TextView> (Resource.Id.timeDisplayStart); 
     pick_button_Start = FindViewById<Button> (Resource.Id.btnPickTimeStart); 

     time_display_End = FindViewById<TextView> (Resource.Id.timeDisplayEnd); 
     pick_button_End = FindViewById<Button> (Resource.Id.btnPickTimeEnd); 

     submitButtonMyslot = FindViewById<Button> (Resource.Id.btnSubmitSlot); 

     submitButtonMyslot.Click += SubmitButtonMyslot_Click; 

     pick_button_Start.Click += delegate { 
      ShowTimePickerDialog (START_TIME_DIALOG_ID); 
     }; 

     pick_button_End.Click += delegate { 
      ShowTimePickerDialog (END_TIME_DIALOG_ID); 
     }; 

     hour = DateTime.Now.Hour; 
     minute = DateTime.Now.Minute; 

     UpdateDisplayStart (hour, minute); 
     UpdateDisplayEnd (hour, minute); 
    } 


    void ShowTimePickerDialog (int pickerID) 
    { 
     switch (pickerID) { 

     case TIME_PICKER_FROM: 
      var dialogStart = new TimePickerFragment (this, hour, minute, this); 
      dialogStart.Show (FragmentManager, null); 
      break; 

     case TIME_PICKER_TO: 
      var dialogEnd = new TimePickerFragment (this, hour, minute, this); 
      dialogEnd.Show (FragmentManager, null); 
      break; 
     } 

    } 

    public void OnTimeSet (TimePicker view, int hourOfDay, int minute) 
    { 
     UpdateDisplayEnd (hourOfDay, minute); 
     UpdateDisplayStart (hourOfDay, minute); 
    } 

    void UpdateDisplayStart (int selectedHours, int selectedMinutes) 
    { 
     time_display_Start.Text = selectedHours + ":" + selectedMinutes; 
    } 

    void UpdateDisplayEnd (int selectedHours, int selectedMinutes) 
    { 
     time_display_End.Text = selectedHours + ":" + selectedMinutes; 
    } 
} 

TimePickerFragment.cs

public class TimePickerFragment:DialogFragment 
{ 
    private readonly Context context; 
    private int hour; 
    private int minute; 
    private readonly TimePickerDialog.IOnTimeSetListener listener; 

    public TimePickerFragment (Context context, int hour, int minute, TimePickerDialog.IOnTimeSetListener listener) 
    { 
     this.context = context; 
     this.hour = hour; 
     this.minute = minute; 
     this.listener = listener; 
    } 

    public override Dialog OnCreateDialog (Bundle savedState) 
    { 
     var dialog = new TimePickerDialog (context, listener, hour, minute, false); 
     return dialog; 
    } 
} 

Я не знаю, как я могу обновить два временных сборщиков в отдельности. Я также попытался поставить метод OnTimeSet внутри этого:

private TimePickerDialog.IOnTimeSetListener From_Time_Listener = new TimePickerDialog.IOnTimeSetListener() 
    { 
     public void OnTimeSet (TimePicker view, int hourOfDay, int minute) 
     { 
      UpdateDisplayEnd (hourOfDay, minute); 
     } 
    }; 

Но это не работает. Это не позволяет мне помещать этот метод внутрь. Кроме того, другие переменные и методы будут неожиданными, если я это сделаю.

ответ

1

Существует несколько способов решения этой проблемы. Самые простой может быть, чтобы установить переменный уровень класса, который отслеживает, которые подборщик является активным, а затем использовать это значение, чтобы определить, какие поля для обновления, когда сборщик завершает:

int activePickerID; 

void ShowTimePickerDialog (int pickerID) 
{ 
    activePickerID = pickerID; 

    switch (pickerID) { 

    case TIME_PICKER_FROM: 
     var dialogStart = new TimePickerFragment (this, hour, minute, this); 
     dialogStart.Show (FragmentManager, null); 
     break; 

    case TIME_PICKER_TO: 
     var dialogEnd = new TimePickerFragment (this, hour, minute, this); 
     dialogEnd.Show (FragmentManager, null); 
     break; 
    } 

} 

public void OnTimeSet (TimePicker view, int hourOfDay, int minute) 
{ 
    if (activePickerID == TIME_PICKER_TO) { 
     UpdateDisplayEnd (hourOfDay, minute); 
    } else { 
     UpdateDisplayStart (hourOfDay, minute); 
    } 
} 
1
public void OnTimeSet (TimePicker view, int hourOfDay, int minute) 
{ 
if(pickerID == TIME_PICKER_FROM){ 
    UpdateDisplayEnd (hourOfDay, minute); 
} 
else if(pickerID == TIME_PICKER_TO) 
{ 
    UpdateDisplayStart (hourOfDay, minute); 
} 
}