Android中DatePickerDialog保留阿语字符串替换阿拉伯数字为英文数字
实现阿拉伯语Locale下DatePickerDialog显示英文数字
完全可以实现这个需求,下面提供两种可行方案,优先推荐第一种基于Locale配置的优雅实现:
方案一:通过自定义Locale指定数字系统(推荐)
利用Android的Locale特性,创建阿拉伯语Locale的同时指定使用拉丁数字系统(即0-9),这样系统会自动用阿拉伯语显示界面文本,同时用英文数字展示日期、年份等数值。
修改LocalizationHelper.java的setLocal方法:
public class LocalizationHelper { public static void setLocal(Context context) { String lang = getLanguage(context); Locale locale; if ("ar".equals(lang)) { // 阿拉伯语环境下,强制使用拉丁数字系统 locale = new Locale.Builder() .setLanguage("ar") .setRegion("LY") .setUnicodeLocaleKeyword("nu", "latn") // 指定数字系统为拉丁数字 .build(); } else { locale = new Locale(lang, "LY"); } Locale.setDefault(locale); Configuration config = new Configuration(); // 适配Android N及以上版本的Locale设置方式 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { config.setLocale(locale); } else { config.locale = locale; } Resources resources = context.getResources(); resources.updateConfiguration(config, resources.getDisplayMetrics()); } public static String getLanguage(Context context) { return SharedPreferencesHelper.getLanguage(context); } }
这个方案的优势是无需修改对话框的UI逻辑,完全依赖系统Locale的配置,兼容性好,且能保证所有系统控件(不止DatePickerDialog)都统一遵循这个数字显示规则。
方案二:自定义NumberPicker格式化器(兼容低版本)
如果需要兼容Android 5.0(API 21)以下的版本(Locale.Builder.setUnicodeLocaleKeyword从API 21开始支持),可以通过自定义NumberPicker的格式化器,强制将数字转为英文数字字符串。
修改调用对话框的代码showDatePicker:
public static void showDatePicker(Context context, OnDialogActionCallBack onDialogActionCallBack, DashboardFilterDate date) { LocalizationHelper.setLocal(context); final Calendar c = Calendar.getInstance(); DatePickerDialog pickerDialog = new DatePickerDialog(context, (view, year1, month1, dayOfMonth) -> onDialogActionCallBack.onPositiveButtonClicked(dayOfMonth, month1, year1), date != null ? date.getYear() : c.get(Calendar.YEAR), date != null ? date.getMonth() : c.get(Calendar.MONTH), date != null ? date.getDay() : c.get(Calendar.DAY_OF_MONTH)); // 获取DatePicker并设置自定义数字格式化器 DatePicker datePicker = pickerDialog.getDatePicker(); findNumberPickers(datePicker).forEach(numberPicker -> { // 强制将数字转为0-9的字符串 numberPicker.setFormatter(String::valueOf); numberPicker.invalidate(); }); pickerDialog.show(); } // 递归查找DatePicker中的所有NumberPicker控件 private static List<NumberPicker> findNumberPickers(View view) { List<NumberPicker> pickers = new ArrayList<>(); if (view instanceof NumberPicker) { pickers.add((NumberPicker) view); return pickers; } if (!(view instanceof ViewGroup)) { return pickers; } ViewGroup group = (ViewGroup) view; for (int i = 0; i < group.getChildCount(); i++) { pickers.addAll(findNumberPickers(group.getChildAt(i))); } return pickers; }
这个方案直接修改DatePicker内部的NumberPicker显示逻辑,确保数字部分显示为0-9,同时保留阿拉伯语的界面文本。需要注意的是,不同Android版本的DatePicker布局可能有差异,若出现适配问题,可能需要调整查找NumberPicker的逻辑。
内容的提问来源于stack exchange,提问作者Toka A. Amin
相关产品推荐
相关产品推荐

