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

如何将Android应用中MaterialDatePicker日历固定为英文?

如何固定MaterialDatePicker的语言为英文(多语言应用中)

要在多语言应用中让MaterialDatePicker始终显示英文,核心思路是让日期选择器的DialogFragment使用仅英文Locale的Context,避免跟随应用的全局语言设置。以下是两种可靠的实现方式:


方法一:自定义MaterialDatePicker子类(推荐)

通过继承MaterialDatePicker,在onAttach方法中传入英文Locale的Context,确保日期选择器内部的所有资源都使用英文:

import android.content.Context
import android.os.Build
import android.os.Bundle
import android.os.LocaleList
import java.util.Locale
import com.google.android.material.datepicker.MaterialDatePicker

class EnglishMaterialDatePicker : MaterialDatePicker<Long>() {
    companion object {
        // 封装你原本的Picker配置
        fun newInstance(): EnglishMaterialDatePicker {
            return EnglishMaterialDatePicker().apply {
                arguments = MaterialDatePicker.Builder.datePicker()
                    .setTheme(R.style.ThemeOverlay_App_MaterialCalendar)
                    .setTitleText("Select Date")
                    .setCalendarConstraints(
                        CalendarConstraints.Builder()
                            .setValidator(DateValidatorPointBackward.now())
                            .build()
                    )
                    .build().arguments
            }
        }
    }

    override fun onAttach(context: Context) {
        // 创建仅使用英文Locale的Context
        val englishLocale = Locale.US
        val config = context.resources.configuration.apply {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                locales = LocaleList(englishLocale)
            } else {
                @Suppress("DEPRECATION")
                locale = englishLocale
            }
        }
        val englishContext = context.createConfigurationContext(config)
        
        super.onAttach(englishContext)
    }
}

使用方式:

val datePicker = EnglishMaterialDatePicker.newInstance()
datePicker.show(supportFragmentManager, "DATE_PICKER_TAG")

方法二:临时修改Activity的Locale(适合快速实现)

在显示日期选择器前,临时将Activity的Locale切换为英文,关闭后恢复原Locale:

import android.os.Build
import android.os.Bundle
import java.util.Locale
import com.google.android.material.datepicker.MaterialDatePicker
import com.google.android.material.datepicker.DateValidatorPointBackward

// 保存原Locale配置
val originalConfig = resources.configuration
val englishLocale = Locale.US

// 应用英文Locale
val englishConfig = Configuration(originalConfig).apply {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        locales = LocaleList(englishLocale)
    } else {
        @Suppress("DEPRECATION")
        locale = englishLocale
    }
}

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    resources.updateConfiguration(englishConfig, resources.displayMetrics)
} else {
    @Suppress("DEPRECATION")
    resources.configuration = englishConfig
}

// 创建并显示日期选择器
val datePicker = MaterialDatePicker.Builder.datePicker()
    .setTheme(R.style.ThemeOverlay_App_MaterialCalendar)
    .setTitleText("Select Date")
    .setCalendarConstraints(
        CalendarConstraints.Builder()
            .setValidator(DateValidatorPointBackward.now())
            .build()
    )
    .build()

// 关闭后恢复原Locale
datePicker.addOnDismissListener {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        resources.updateConfiguration(originalConfig, resources.displayMetrics)
    } else {
        @Suppress("DEPRECATION")
        resources.configuration = originalConfig
    }
    // 可选:如果界面有残留,调用recreate刷新Activity
    // recreate()
}

datePicker.show(supportFragmentManager, "DATE_PICKER_TAG")

注意事项:

  • 方法一不会影响应用其他部分的语言设置,是更安全的方案;
  • 方法二中如果不调用recreate(),部分控件可能残留英文,需根据实际情况选择;
  • 确保你的项目中已引入Material Components库的最新版本,避免兼容性问题。

内容的提问来源于stack exchange,提问作者Ravi.Dudi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 18:23:08