设置Android DatePicker标题语言

时间:2017-08-24 22:23:12

标签: android xamarin xamarin.android

我有一个提供4种语言的应用,可以在应用中选择。在Android上,DatePicker有一个标题。即使在设置了语言环境之后,此标题似乎总是支持设备区域设置。只有标题才能这样做,因为DatePicker的功能部分是以应用程序选择的语言。

以下是应用设置为韩语时的样子。

enter image description here

如何将8月24日星期四改为韩国人?我已将Xamarin和Android区域设置为韩语。我可以设置日期选择器渲染器中的属性吗?

感谢。

1 个答案:

答案 0 :(得分:1)

如果你正在做这样的事情来应用新的语言环境上下文基本配置:

localhost

Material-design protected override void AttachBaseContext(Android.Content.Context @base) { Locale locale = Locale.Korean; Locale.SetDefault(Locale.Category.Format, locale); @base.Resources.Configuration.SetLocale(locale); var newContext = @base.CreateConfigurationContext(@base.Resources.Configuration); base.AttachBaseContext(newContext); } 没有正确地遵守上下文的语言环境,而是传递给它的.ctor,你最终会得到错误的Title本地化,如你的问题所示;-(

一个选项是继承CalendarView并重新实现DatePicker并将其应用于子类DatePickerCalendarDelegate,但这对于正确编码有点疯狂解决了这个问题。

所以这是我一直在使用的修复(hack)(简化为SO,所以你需要API API各种API级别检查等等):

Material Design Fix(包括Oreo beta):

AlertDialog

用法:

// globals/cached
bool headerChangeFlag = true;
TextView headerTextView;
string headerDatePatternLocale;
SimpleDateFormat monthDayFormatLocale;

void SetHeaderMonthDay(DatePickerDialog dialog, Locale locale)
{
    if (headerTextView == null)
    {
        // Material Design formatted CalendarView being used, need to do API level check and skip on older APIs
        var id = base.Resources.GetIdentifier("date_picker_header_date", "id", "android");
        headerTextView = dialog.DatePicker.FindViewById<TextView>(id);
        headerDatePatternLocale = Android.Text.Format.DateFormat.GetBestDateTimePattern(locale, "EMMMd");
        monthDayFormatLocale = new SimpleDateFormat(headerDatePatternLocale, locale);
        headerTextView.SetTextColor(Android.Graphics.Color.Red);
        headerTextView.TextChanged += (sender, e) =>
        {
            headerChangeFlag = !headerChangeFlag;
            if (!headerChangeFlag)
                return;
            SetHeaderMonthDay(dialog, locale);
        };
    }
    var selectedDateLocale = monthDayFormatLocale.Format(new Date((long)dialog.DatePicker.DateTime.ToUniversalTime().Subtract(
              new System.DateTime(1970, 1, 1, 0, 0, 0, System.DateTimeKind.Utc)).TotalMilliseconds));
    headerTextView.Text = selectedDateLocale;
}

结果:

enter image description here