从日历中减去天数

时间:2018-08-10 14:03:28

标签: android kotlin calendar

我的应用程序中有一个水平日历。因此,我实现了以下库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()
    }
}
}

3 个答案:

答案 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 方法