Xamarin - слушатели и события библиотеки Java?
Я пытаюсь получить доступ к пользовательским слушателям в этой библиотеке Android с помощью привязок Xamarin (оригинал здесь), когда календарь прокручивается до другого месяца или в календаре выбрана дата.
Слушатели в коде, приведенном в примере:
compactCalendarView.setListener(new CompactCalendarView.CompactCalendarViewListener() {
@Override
public void onDayClick(Date dateClicked) {
List<Event> events = compactCalendarView.getEvents(dateClicked);
Log.d(TAG, "Day was clicked: " + dateClicked + " with events " + events);
}
@Override
public void onMonthScroll(Date firstDayOfNewMonth) {
Log.d(TAG, "Month was scrolled to: " + firstDayOfNewMonth);
}
});
В частности, я хотел бы получить доступ к слушателю onDayClick. Код для этого в своем классе Controller в Java не определяет кнопку, а скорее вычисляет положение в календаре даты, на которую вы щелкнули, а затем возвращает дату на основе этого расчета.
void onSingleTapUp(MotionEvent e) {
// Don't handle single tap when calendar is scrolling and is not stationary
if (isScrolling()) {
return;
}
int dayColumn = Math.round((paddingLeft + e.getX() - paddingWidth - paddingRight) / widthPerDay);
int dayRow = Math.round((e.getY() - paddingHeight) / heightPerDay);
setCalenderToFirstDayOfMonth(calendarWithFirstDayOfMonth, currentDate, monthsScrolledSoFar(), 0);
int firstDayOfMonth = getDayOfWeek(calendarWithFirstDayOfMonth);
int dayOfMonth = ((dayRow - 1) * 7) - firstDayOfMonth;
if (isRtl) {
dayOfMonth += 6 - dayColumn;
} else {
dayOfMonth += dayColumn;
}
if (dayOfMonth < calendarWithFirstDayOfMonth.getActualMaximum(Calendar.DAY_OF_MONTH)
&& dayOfMonth >= 0) {
calendarWithFirstDayOfMonth.add(Calendar.DATE, dayOfMonth);
currentCalender.setTimeInMillis(calendarWithFirstDayOfMonth.getTimeInMillis());
performOnDayClickCallback(currentCalender.getTime());
}
}
Попытка объявить слушателя как CompactCalendarView.ICompactCalendarViewListener listener;
кажется, объявляет это нормально, но попытка назначить ему новый CompactCalendarViewListener() дает мне ошибку "Неопределенная функция".
Я понимаю, что C# использует события вместо слушателей, но я не знаю, как он обрабатывает определяемые пользователем слушатели в библиотеках Java или как переопределить события, такие как onDayClick/onMonthScroll.
Любая помощь очень ценится!
1 ответ
Ваши классы в Xamarin.Android, использующие C#, не могут быть анонимными, так как C# не поддерживает анонимные объявления, что вам нужно сделать, это что-то вроде этого:
compactCalendarView.SetListener(new CompactCalendarViewListener());
А затем определить класс, который наследует от Java.Lang.Object
для метода Android Dispose и интерфейса, который вы хотите использовать, как показано ниже:
public class CompactCalendarViewListener : Java.Lang.Object, CompactCalendarView.ICompactCalendarViewListener
{
public void OnDayClick(Date p0)
{
// throw new System.NotImplementedException();
}
public void OnMonthScroll(Date p0)
{
//throw new System.NotImplementedException();
}
}