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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 23:45:31