You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为kizitonwose CalendarView添加月份标题头部

解决kizitonwose CalendarView添加月份标题的问题

核心问题分析

你当前的cv_monthHeaderResource指向的是仅包含星期标题的布局,没有预留月份标题的位置,且monthHeaderBinder只处理了星期名称的绑定,未实现月份标题的更新逻辑。以下是具体修复步骤:


步骤1:重构月份头部布局

创建/修改calendar_month_header_layout.xml,同时包含月份标题和星期标题容器:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="8dp">

    <!-- 月份标题TextView -->
    <TextView
        android:id="@+id/monthTitleText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:textStyle="bold"
        android:gravity="center"
        android:paddingBottom="8dp"/>

    <!-- 星期标题容器 -->
    <LinearLayout
        android:id="@+id/dayTitlesContainer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:justifyContent="space-around">

        <!-- 7个TextView对应星期几,重复以下代码7次 -->
        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"/>
    </LinearLayout>
</LinearLayout>

更新CalendarView的布局引用:

<com.kizitonwose.calendar.view.CalendarView
    android:id="@+id/calendarView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:cv_dayViewResource="@layout/calendar_day_layout"
    app:cv_monthHeaderResource="@layout/calendar_month_header_layout" />

同时移除原XML中重复的monthHeaderContainer和titlesContainer两个include标签,避免布局冗余。


步骤2:修改Fragment中的绑定逻辑

更新MonthViewContainer以包含月份标题控件,并调整monthHeaderBinder实现月份标题的动态更新:

1. 新增必要导入

import java.time.format.DateTimeFormatter
import java.util.Locale

2. 重构MonthViewContainer

class MonthViewContainer(view: View) : ViewContainer(view) {
    val monthTitleText = view.findViewById<TextView>(R.id.monthTitleText)
    val dayTitlesContainer = view.findViewById<ViewGroup>(R.id.dayTitlesContainer)
}

3. 更新monthHeaderBinder

binding.calendarView.monthHeaderBinder = object : MonthHeaderFooterBinder<MonthViewContainer> {
    override fun create(view: View) = MonthViewContainer(view)
    override fun bind(container: MonthViewContainer, data: CalendarMonth) {
        // 生成土耳其语格式的月份标题(如Nisan 2023)
        val trLocale = Locale("tr", "TR")
        val monthFormatter = DateTimeFormatter.ofPattern("MMMM yyyy", trLocale)
        container.monthTitleText.text = data.yearMonth.format(monthFormatter)

        // 星期标题仅初始化一次(因为星期顺序不会改变)
        if (container.dayTitlesContainer.tag == null) {
            container.dayTitlesContainer.tag = true
            container.dayTitlesContainer.children.map { it as TextView }.forEachIndexed { index, textView ->
                val title = when (index) {
                    0 -> "Pzt"
                    1 -> "Sal"
                    2 -> "Çar"
                    3 -> "Per"
                    4 -> "Cum"
                    5 -> "Cmt"
                    6 -> "Paz"
                    else -> ""
                }
                textView.text = title
            }
        }
    }
}

关键说明

  • 移除了原布局中重复的头部控件,让CalendarView的monthHeader统一管理月份和星期标题
  • 使用Locale和DateTimeFormatter生成本地化月份名称,避免硬编码
  • 星期标题仅初始化一次,月份标题随CalendarView滚动动态更新

内容的提问来源于stack exchange,提问作者Ahmet Kaan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 21:20:25