Есть куча ошибок, которые я обнаружил после отслеживания всех классов.
Ошибка 1
Это ошибка документации Android.См. CalendarViewBindingAdapter class.
Вы можете видеть, что они создали адаптер привязки для android:date
, но нет @InverseBindingAdapter
.
@BindingAdapter({"android:date"})
public static void setDate(CalendarView view, long date) {
if (view.getDate() != date) {
view.setDate(date);
}
}
// no @InverseBindingAdapter written
Но на документация , они написали, что CalendarView
поддерживает двустороннее связывание.
Возможно, мы получим это в следующих обновлениях.
Я также пытался добавить @InverseBindingAdapter
, но этотоже не работал
@InverseBindingAdapter(attribute = "android:date", event = "android:dateAttrChanged")
public static long getDateLong(CalendarView view) {
return view.getDate();
}
Ошибка 2
Попробуйте установить setOnDateChangeListener
на CalendarView
, вы всегда получите одну и ту же дату.
Ниже не работает
binding.cal.setOnDateChangeListener((view, year, month, dayOfMonth) -> {
Log.d(TAG, "aLong: " + new Date(view.getDate()).toString());
});
Ниже работает
binding.cal.setOnDateChangeListener((view, year, month, dayOfMonth) -> {
Log.d(TAG, "aLong: " + new Date(year, month, dayOfMonth).toString());
});
Вот почему мой @InverseBindingAdapter
не работает.
Поскольку calendarView.getDate()
не дает правильноеdate.
Fix
Вы можете исправить это, создав адаптер, пока они не устранят эту проблему.Просто поместите ниже класс в вашем проекте, и все будет работать хорошо.
public class CalendarViewBindingAdapter {
@BindingAdapter(value = {"android:onSelectedDayChange", "android:dateAttrChanged"},
requireAll = false)
public static void setListeners(CalendarView view, final CalendarView.OnDateChangeListener onDayChange,
final InverseBindingListener attrChange) {
if (attrChange == null) {
view.setOnDateChangeListener(onDayChange);
} else {
view.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
@Override
public void onSelectedDayChange(CalendarView view, int year, int month,
int dayOfMonth) {
if (onDayChange != null) {
onDayChange.onSelectedDayChange(view, year, month, dayOfMonth);
}
Calendar instance = Calendar.getInstance();
instance.set(year, month, dayOfMonth);
view.setDate(instance.getTimeInMillis());
attrChange.onChange();
}
});
}
}
}
То, что я исправил
Я просто установил дату в CalendarView (view.setDate()
), которая была 0 ранее.