Xamarin - Java 图书馆听众和事件?
Xamarin - Java Library Listeners and Events?
我正在尝试在此 Android library with Xamarin bindings (original here) 中访问用户定义的侦听器,以便当日历滚动到另一个月份或在日历上选择日期时。
示例中给出的代码中的监听器如下:
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 侦听器。它在 Java 中的控制器 class 中的代码没有指定按钮,而是计算您单击的日期在日历中的位置,然后 returns 基于该计算的日期.
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() 时会出现 "Undefined function" 错误。
我了解 C# 使用事件而不是侦听器,但我不知道它如何处理 Java 库中的用户定义侦听器,或者如何覆盖 onDayClick/onMonthScroll 等事件。
非常感谢任何帮助!
你在 Xamarin.Android 中使用 C# 的 classes 不能是匿名的,因为 C# 不支持匿名声明你需要做的是这样的:
compactCalendarView.SetListener(new CompactCalendarViewListener());
然后为 Android 的 Dispose 方法定义一个继承自 Java.Lang.Object
的 class 以及您要使用的接口,如下所示:
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();
}
}
我正在尝试在此 Android library with Xamarin bindings (original here) 中访问用户定义的侦听器,以便当日历滚动到另一个月份或在日历上选择日期时。
示例中给出的代码中的监听器如下:
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 侦听器。它在 Java 中的控制器 class 中的代码没有指定按钮,而是计算您单击的日期在日历中的位置,然后 returns 基于该计算的日期.
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() 时会出现 "Undefined function" 错误。
我了解 C# 使用事件而不是侦听器,但我不知道它如何处理 Java 库中的用户定义侦听器,或者如何覆盖 onDayClick/onMonthScroll 等事件。
非常感谢任何帮助!
你在 Xamarin.Android 中使用 C# 的 classes 不能是匿名的,因为 C# 不支持匿名声明你需要做的是这样的:
compactCalendarView.SetListener(new CompactCalendarViewListener());
然后为 Android 的 Dispose 方法定义一个继承自 Java.Lang.Object
的 class 以及您要使用的接口,如下所示:
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();
}
}