我的应用程序中有一个水平日历。因此,我实现了以下库https://github.com/Mulham-Raee/Horizontal-Calendar 我还实现了自己的后退和前进按钮。
后退需要从当前日期返回一天,前进则需要一天。假设今天是8月10日,而我一直滚动到7月15日,而没有按下Back或Forward按钮。现在,如果我按后退按钮而不是7月14日,则回到8月9日。
以下是我的代码
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<com.myapplication.HorizontalCalendarView
android:id="@+id/calendarView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:selectedDateBackground="@drawable/selected_date"
/>
<Button
android:id="@+id/back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginStart="8dp"
android:text="Back"
app:layout_constraintBottom_toTopOf="@+id/calendarView"
app:layout_constraintStart_toStartOf="parent" />
<Button
android:id="@+id/forward"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginEnd="16dp"
android:text="Forward"
app:layout_constraintBottom_toTopOf="@+id/calendarView"
app:layout_constraintEnd_toEndOf="parent" />
</android.support.constraint.ConstraintLayout>
科特琳代码:
class MainActivity : AppCompatActivity() {
private var counter: Int = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main_2)
val format1 = SimpleDateFormat("yyyy-MM-dd", Locale.US)
val currentDate = format1.format(Calendar.getInstance().time)
Toast.makeText(this,currentDate.toString(),Toast.LENGTH_LONG).show()
val startDate = Calendar.getInstance()
startDate.add(Calendar.MONTH, -10)
val endDate = Calendar.getInstance()
endDate.add(Calendar.MONTH, 30)
val horizontalCalendar = HorizontalCalendar.Builder(this, R.id.calendarView)
.range(startDate, endDate)
.datesNumberOnScreen(7)
.build()
horizontalCalendar.setCalendarListener(object : HorizontalCalendarListener() {
override fun onDateSelected(date: Calendar, position: Int) {
val selectedDate = format1.format(date.time)
Toast.makeText(this@MainActivity,
"Pritish"+SimpleDateFormat("MMMM yyyy", Locale.US).format(date.time),
Toast.LENGTH_SHORT).show()
if(format1.parse(selectedDate).before(format1.parse(currentDate))){
Toast.makeText(this@MainActivity,"Cannot selecte previous date",Toast.LENGTH_LONG).show()
} else {
Toast.makeText(this@MainActivity,
selectedDate
,Toast.LENGTH_LONG).show()
}
}
override fun onCalendarScroll(calendarView: HorizontalCalendarView,
dx: Int, dy: Int) {
Log.i("Pritish",dx.toString()+dy.toString())
counter += if(dx<0){
-1
} else {
1
}
}
override fun onDateLongClicked(date: Calendar, position: Int): Boolean {
return true
}
})
val cal = Calendar.getInstance()
back.setOnClickListener {
cal.add(Calendar.DAY_OF_MONTH,counter-1)
counter = 0
horizontalCalendar.selectDate(cal,false)
horizontalCalendar.refresh()
}
forward.setOnClickListener {
cal.add(Calendar.DAY_OF_MONTH,counter+1)
counter = 0
horizontalCalendar.selectDate(cal,false)
horizontalCalendar.refresh()
}
}
}
答案 0 :(得分:0)
onDateSelected
可能会在滚动过程中被触发,您可以使用它加上一个简单的+ 1 / -1,但是您必须尝试一下以查看其是否有效-仅基于查看库的代码很难进行验证。
答案 1 :(得分:0)
您提供的代码有一个解决方案。尝试保持滑动次数的全局计数器(-1表示向后滑动,+ 1表示向前滑动)。每次发生滑动事件时,请更新该计数器。
然后,在您的前后监听器中,使用该计数器。例如,如果您向后滑动5天,则COUNTER = -5
。然后,如果用户单击“后退”按钮,
cal.add(Calendar.DAY_OF_MONTH, (COUNTER-1))
请记住,每次单击按钮后都要将计数器重置为0。
要将其与onCalendarScroll
结合使用,可以设置另一个跟踪总dx变化的全局变量。当dx达到某个值时,您就知道已经进行了一次完全滑动,因此计数器+/-1。以下代码说明了这一点:
private var dx_tracker: Int = 0
private var counter: Int = 0
private SWIPE_VAL = <your tested value>
override fun onCalendarScroll(calendarView: HorizontalCalendarView,
dx: Int, dy: Int) {
Log.i("Pritish", dx.toString() + dy.toString())
dx_tracker += dx
if(dx_tracker >= SWIPE_VAL) {
counter += 1;
dx_tracker = 0;
}
else if(dx_tracker <= -SWIPE_VAL) {
counter -= 1;
dx_tracker = 0;
}
}
答案 2 :(得分:0)
您需要在 cal 实例中设置日期。
我没有找到设置 cal 实例的任何语法。
您已经定义了这样的cal实例
val cal = Calendar.getInstance()
您的计数器没有增加。因此,它将带您到以前的日期。 cal 始终存储8月10日,如果您没有按任何按钮。
您可以重置 cal 实例 onDateSelected 方法