Android 5.1.1中SetFormatter与SetDisplayedValues方法失效问题
Android 5.1.1中NumberPicker月份两位数字格式化失效的解决方法
问题分析
在Android 5.1.1(API 22)中,DatePicker内置的NumberPicker调用SetFormatter和SetDisplayedValues(null)无法生效,主要因为该版本NumberPicker存在逻辑缺陷,且DatePicker的初始化流程会覆盖自定义设置。
解决方法
1. 延迟执行自定义设置
利用Post方法延迟执行格式化配置,确保NumberPicker完成系统初始化后再应用自定义逻辑:
NumberPicker numberPicker; if (datePickerNumericMonthFormat && monthSpinnerResId != 0) { numberPicker = onCreateEventOrNot ? dialog.DatePicker.FindViewById<NumberPicker>(monthSpinnerResId) : view.FindViewById<NumberPicker>(monthSpinnerResId); if (numberPicker != null) { // 设置输入框为数字类型 var input = numberPicker.FindViewById<EditText>(Activity.Resources.GetIdentifier("android:id/numberpicker_input", null, null)); input?.SetRawInputType(global::Android.Text.InputTypes.ClassNumber); // 延迟执行格式化,避免被系统初始化覆盖 numberPicker.Post(() => { // 生成两位数字的月份显示数组 string[] monthDisplayValues = new string[12]; for (int i = 0; i < 12; i++) { monthDisplayValues[i] = (i + 1).ToString("D2"); } numberPicker.SetDisplayedValues(monthDisplayValues); numberPicker.MinValue = 0; numberPicker.MaxValue = 11; // 触发值变化强制刷新显示 numberPicker.Value = numberPicker.Value; }); } }
2. 放弃Formatter,直接使用DisplayedValues
Android 5.1.1的NumberPicker对IFormatter的支持存在bug,直接生成两位数字的月份数组作为DisplayedValues是更可靠的方式:
// 生成1-12的两位数字显示数组 string[] monthDisplayValues = Enumerable.Range(1, 12) .Select(m => m.ToString("D2")) .ToArray(); numberPicker.SetDisplayedValues(monthDisplayValues); numberPicker.MinValue = 0; numberPicker.MaxValue = 11;
3. 修正原代码的空指针隐患
原代码中先调用numberPicker.FindViewById再赋值numberPicker,会导致空指针异常,需调整顺序,确保先获取到有效的NumberPicker实例再操作其子View。
关键说明
- Android 5.1.1的NumberPicker在调用
SetDisplayedValues(null)后,无法正确绑定IFormatter,改用自定义显示数组可绕过此问题。 - DatePicker的初始化流程会在View创建后异步完成,延迟执行自定义设置能避免被系统逻辑覆盖。
- 手动触发
numberPicker.Value = numberPicker.Value可以强制NumberPicker刷新显示内容,确保格式化生效。
内容的提问来源于stack exchange,提问作者Fairoz Pasha
相关产品推荐
相关产品推荐

