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

Android中Material 2 DatePicker文本尺寸过小问题求助

问题:Material 2 DatePicker文本尺寸异常偏小

在Material Design Components(MDC)中实现Material 2 DatePicker时,未设置任何自定义主题或样式,但运行时日期选择器的文本尺寸异常小。参考同类无额外样式设置的示例显示正常,异常效果截图如下:
异常的DatePicker文本


相关代码

AndroidManifest.xml

<application
    android:name=".MyApplication"
    android:allowBackup="false"
    android:dataExtractionRules="@xml/data_extraction_rules"
    android:fullBackupContent="@xml/backup_rules"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    android:usesCleartextTraffic="false"
    tools:targetApi="31">

Fragment.kt

private fun showDatePicker(){
    viewBinding.btnEditProfile.setOnClickListener {
        object : DialogDatePicker(requireActivity()) {
            override fun onSelectedDate(date: String) {
                viewBinding.root.showSnackbar(date)
            }
        }.singleDatePicker(fragmentManager = childFragmentManager,
            startDate = -70,
            endDate = -10)
    }
}

DatePicker工具代码

fun singleDatePicker(fragmentManager: FragmentManager, startDate : Int = 0, endDate : Int = 0){

    val today = Date()

    val starCal = Calendar.getInstance()
    starCal.time = today
    starCal.add(Calendar.YEAR, startDate)

    val endCal = Calendar.getInstance()
    endCal.time = today
    endCal.add(Calendar.YEAR, startDate)

    val constraintsBuilder = CalendarConstraints.Builder()
    if (endDate != 0) {
        constraintsBuilder.setEnd(endCal.timeInMillis)
        constraintsBuilder.setOpenAt(endCal.timeInMillis)
    }
    if (startDate != 0)
        constraintsBuilder.setStart(endCal.timeInMillis)

    val builder = MaterialDatePicker.Builder.datePicker()
        .setTitleText("Pilih Tanggal")
        .setCalendarConstraints(constraintsBuilder.build())

    val picker = builder.build()

    // 处理选中日期的监听器
    picker.addOnPositiveButtonClickListener { selection ->
        if (selection != null) {
            val calendar = Calendar.getInstance()
            calendar.timeInMillis = selection
            val year = calendar.get(Calendar.YEAR)
            val month = calendar.get(Calendar.MONTH)
            val day = calendar.get(Calendar.DAY_OF_MONTH)
            onSelectedDate(
                year.toString()+"-"+ String.format(
                    "%02d",
                    month + 1
                )+ "-" + String.format("%02d", day)
            )
        }
    }

    // 显示日期选择器
    picker.show(fragmentManager, picker.toString())
}

Theme.xml

<resources xmlns:tools="http://schemas.android.com/tools">
<!-- 基础应用主题 -->
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
    <!-- 主品牌颜色 -->
    <item name="colorPrimary">@color/blue_500</item>
    <item name="colorPrimaryDark">@color/blue_800</item>
    <item name="colorAccent">@color/blue_300</item>
    <item name="colorPrimaryVariant">@color/blue_650</item>
    <item name="colorOnPrimary">@color/white</item>
    <!-- 次品牌颜色 -->
    <item name="colorSecondary">@color/blue_800</item>
    <item name="colorSecondaryVariant">@color/blue_800</item>
    <item name="colorOnSecondary">@color/blue_200</item>

    <item name="android:windowBackground">@color/blue_700</item>
    <item name="android:colorForeground">@color/blue_600</item>
    <item name="buttonTint">?attr/colorPrimary</item>
    <item name="textAppearanceCaption">@color/caption</item>
    <item name="textAppearanceBodySmall">@color/blue_100</item>
    <item name="textAppearanceBodyMedium">@color/blue_100</item>
    <item name="textAppearanceBodyLarge">@color/blue_100</item>
    <item name="textAppearanceSubtitle1">@color/blue_100</item>
    <item name="textAppearanceSubtitle2">@color/blue_100</item>
    <item name="textAppearanceHeadline5">@color/blue_100</item>
    <item name="textAppearanceHeadline4">@color/blue_100</item>
    <item name="textAppearanceHeadline3">@color/blue_100</item>
    <item name="textAppearanceHeadline2">@color/blue_100</item>
    <item name="textAppearanceHeadline1">@color/blue_100</item>
    <item name="colorOutline">@color/blue_500</item>
    <item name="hintTextColor">@color/grey_cold</item>
    <item name="indicatorColor">@color/light_grey</item>
    <item name="colorTertiary">@color/blue_200</item>
    <item name="colorOnTertiary">@color/blue_700</item>
    <item name="android:activatedBackgroundIndicator">@color/grey</item>

    <!-- 状态栏颜色 -->
    <item name="android:statusBarColor">@color/blue_700</item>
    <!-- 自定义主题区域 -->
</style>

问题原因与解决方案

原因

你在AppTheme中错误地将所有textAppearanceXXX属性直接设置为颜色值,但textAppearance属性的正确用法是引用包含字体大小、样式、颜色等完整配置的TextAppearance样式,而非单纯的颜色。这种错误覆盖会导致依赖这些文本样式的组件(包括MaterialDatePicker)丢失默认的字体大小配置,从而显示异常偏小的文本。

解决方法

  1. 修正主题中的textAppearance配置:将所有直接设置颜色的textAppearanceXXX项,替换为Material Components提供的默认文本样式,或自定义包含完整配置的TextAppearance样式。

    示例修正后的Theme.xml片段:

    <!-- 替换原有的textAppearance相关配置 -->
    <item name="textAppearanceCaption">@style/TextAppearance.MaterialComponents.Caption</item>
    <item name="textAppearanceBodySmall">@style/TextAppearance.MaterialComponents.Body2</item>
    <item name="textAppearanceBodyMedium">@style/TextAppearance.MaterialComponents.Body1</item>
    <item name="textAppearanceBodyLarge">@style/TextAppearance.MaterialComponents.Body1</item>
    <item name="textAppearanceSubtitle1">@style/TextAppearance.MaterialComponents.Subtitle1</item>
    <item name="textAppearanceSubtitle2">@style/TextAppearance.MaterialComponents.Subtitle2</item>
    <item name="textAppearanceHeadline5">@style/TextAppearance.MaterialComponents.Headline5</item>
    <!-- 其他textAppearance项同理替换 -->
    

    如果需要自定义文本颜色,应在对应的TextAppearance样式中设置,例如:

    <!-- 自定义带颜色的文本样式 -->
    <style name="CustomBodyText" parent="@style/TextAppearance.MaterialComponents.Body1">
        <item name="android:textColor">@color/blue_100</item>
    </style>
    <!-- 在主题中引用自定义样式 -->
    <item name="textAppearanceBodyLarge">@style/CustomBodyText</item>
    
  2. 额外检查:确认你的MDC依赖版本与参考示例一致,避免版本差异导致的样式兼容问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 05:34:55