Xamarin - слушатели и события библиотеки Java? - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь получить доступ к пользовательским слушателям в этой библиотеке 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 Ответ

0 голосов
/ 28 февраля 2019

Ваши классы в Xamarin. Android, использующий C #, не может быть анонимным, так как C # не поддерживает анонимные объявления. Вам нужно сделать что-то вроде этого:

compactCalendarView.SetListener(new CompactCalendarViewListener());

А затем определить класс, который наследуется от Java.Lang.Object для метода утилизации Android и интерфейса, который вы хотите использовать, как показано ниже:

 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();
    }
}
...