Android DatePickerDialog升级minSdk到26后月份显示M+数字异常如何修复
问题原因
该异常是Android 8.0(API level 26)版本后,原生DatePickerDialog的本地化格式适配逻辑变更导致的:当构造对话框使用的Context未明确指定Locale配置时,部分场景下会触发月份格式化异常,显示为M+数字的格式。
可行解决方案
方案1:使用本地化Context构造对话框(最稳妥,无需修改资源配置)
修改你的showDatePickerDialog方法,在创建DatePickerDialog前先构造适配了系统默认Locale的Context,替换原Context传入构造方法即可,修改后代码如下:
public static void showDatePickerDialog(Context context, DatePickerCallback datePickerCallback) { Calendar calendar = Calendar.getInstance(); int buttonColor = ContextCompat.getColor(context, R.color.black); // 新增:构造适配系统默认Locale的上下文,解决日期格式化异常 Configuration config = new Configuration(context.getResources().getConfiguration()); config.setLocale(Locale.getDefault()); Context localizedContext = context.createConfigurationContext(config); // 这里替换为localizedContext创建对话框 DatePickerDialog datePickerDialog = new DatePickerDialog(localizedContext, R.style.DatePickerDialogTheme, (view, year, month, dayOfMonth) -> { calendar.set(Calendar.YEAR, year); calendar.set(Calendar.MONTH, month); calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); datePickerCallback.onDateSelected(calendar.getTime()); }, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)); datePickerDialog.show(); datePickerDialog.getButton(DialogInterface.BUTTON_NEGATIVE).setTextColor(buttonColor); datePickerDialog.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(buttonColor); }
方案2:修改自定义主题配置
如果你不想修改代码逻辑,可以在你定义的R.style.DatePickerDialogTheme中补充以下属性,强制指定日期选择器的样式格式:
<style name="DatePickerDialogTheme" parent="Theme.AppCompat.Light.Dialog"> <!-- 原有属性保持不变,新增以下配置 --> <item name="android:datePickerMode">calendar</item> <item name="android:calendarViewShown">true</item> <item name="android:spinnersShown">false</item> </style>
两种方案任选其一即可解决月份显示异常的问题,成功后月份会按照系统Locale的默认格式显示为英文缩写、中文月份等预期样式。
内容的提问来源于stack exchange,提问作者zurakos
相关产品推荐
相关产品推荐

