首页 > 解决方案 > 如何在 Kotlin Android 中将日期选择器微调器对话框月份的语言更改为印度尼西亚语?

问题描述

在我的应用程序设计计划中,我想使用印度尼西亚语。在这种选择日期的情况下,我使用标准的 datepicker spinner 对话框,但我不知道如何更改月份的语言。这就是我的 datepickker 微调器的样子。如何将月份名称更改为印度尼西亚语,例如“Jan, Feb, Mar, Apr, Mei, Jun, Jul, Agu, Sep, Okt, Nov, Des”?

在此处输入图像描述

这是我的代码

            val cal: Calendar = Calendar.getInstance()
            val year: Int = cal.get(Calendar.YEAR)
            val month: Int = cal.get(Calendar.MONTH)
            val day: Int = cal.get(Calendar.DAY_OF_MONTH)

            val dialog =
                DatePickerDialog(
                    context,
                    R.style.Theme_Holo_Light_Dialog_NoActionBar_MinWidth,
                    { _, year, month, day ->
                         listener.setTheDate(year, month, day) // this to change TextView
                    },
                    year, month, day
                )
            dialog.datePicker.maxDate = Date().time
            dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
            dialog.show()

我也想让按钮(取消和确定)成为印度尼西亚语,如“Batal”和“OK”。期待支持。谢谢你。

标签: androidkotlindatepickerdialogandroid-spinner

解决方案


您可以像这里一样制作自定义日期选择器对话框。

因此,您可以创建自己的自定义小部件,称为 AppLocaleDatePickerDialog 或扩展 DatePickerDialog 的东西。在某些日期和时间选择器中有代表,因此您也需要检查这些代表。

private void initPicker(Object object, String[] values) {
    try {
        Field[] fields = object.getClass().getDeclaredFields();

        for (Field field : fields) {
            // If there's a delegate, we use it instead.
            if (field.getName().equals("mDelegate")) {
                field.setAccessible(true);
                object = field.get(object);
                fields = object.getClass().getDeclaredFields();
                break;
            }
        }

        for (Field field : fields) {
            if (field.getName().equals("mAmPmStrings") ||
                    field.getName().equals("mShortMonths")) {
                field.setAccessible(true);
                field.set(object, values);
            } else if (field.getName().equals("mAmPmSpinner") ||
                    field.getName().equals("mMonthSpinner")) {
                field.setAccessible(true);
                Object innerObject = field.get(object);
                Method method = innerObject.getClass().getDeclaredMethod(
                        "setDisplayedValues", String[].class);
                method.setAccessible(true);
                method.invoke(innerObject, (Object) values);
            }
        }

        Method[] methods = object.getClass().getDeclaredMethods();

        for (Method method : methods) {
            if (method.getName().equals("updateAmPmControl") ||
                    method.getName().equals("updateSpinners")) {
                method.setAccessible(true);
                method.invoke(object);
                break;
            }
        }
    } catch (Exception e) {
        Log.e(APP_TAG, e.getMessage(), e);
    }
}

在 res/values/arrays.xml 中定义您的月份,并为您的语言创建值。如果是德语,则为 res/values-de/arrays.xml。

<string-array name="months_values">
<item>Jan</item>
<item>Feb</item>
<item>Mar</item>
<item>Apr</item>
<item>May</item>
<item>Jun</item>
<item>Jul</item>
<item>Aug</item>
<item>Sep</item>
<item>Oct</item>
<item>Nov</item>
<item>Dec</item></string-array>

并在自定义小部件的声明中像这样初始化它:

initPicker(datePicker, resources.getStringArray(R.array.calendar_months));

关于按钮。您可以使用 setNegativeText() 和 setPositiveText() 轻松设置对话框的按钮文本。

dialog.setNegativeText(context.getResources().getString(R.string.cancel));
dialog.setPositiveText(context.getResources().getString(R.string.ok));

如果您需要有关使用字符串资源的更多信息,可以在此处找到。


推荐阅读