Как изменить порядок дат (с даты по умолчанию на день / месяц / год) в спиннерах Xamarin.Forms для Android? - PullRequest
2 голосов
/ 07 октября 2019

Я заменил стиль выбора данных по умолчанию на спиннер, но теперь мне нужно изменить формат даты (для счетчика, а не для «результата»), чтобы он был одинаковым во всех культурах (дд / мм / гггг)).

Я пытался изменить формат, но это формат заполнителя ...

Я уверен, что есть возможность изменить его в styles.xml, но яне знаю, как это сделать.

В styles.xml у меня есть:

<item name="android:dialogTheme">@style/MyDialogTheme</item>
<item name="android:datePickerStyle">@style/MyDatePicker</item>

<style name="MyDialogTheme" parent="android:Theme.Material.Light.Dialog">
<item name="android:datePickerStyle">@style/MyDatePicker</item>
<item name="android:datePickerMode">spinner</item>
<item name="android:calendarViewShown">false</item>
<item name="android:spinnersShown">true</item>
</style>

<style name="MyDatePicker" parent="android:Widget.Material.Light.DatePicker">
<item name="android:datePickerMode">spinner</item>
<item name="android:calendarViewShown">false</item>
<item name="android:spinnersShown">true</item>
</style>

Есть способ изменить это здесь или в пользовательском рендерере?

Ответы [ 2 ]

1 голос
/ 22 октября 2019

У меня была такая же проблема, я нашел этот ответ полезным, но это для родного андроида, мне пришлось сделать некоторые изменения для Xamarin.Forms Android, создать пользовательский рендерер и добавить следующие строки:

protected override DatePickerDialog CreateDatePickerDialog(int year, int month, int day)
{
    var dialog = base.CreateDatePickerDialog(year, month, day);
    dialog.Show();
    OrderDate(dialog, new char[] { 'd', 'm', 'y' });
    return dialog;
}

private void OrderDate(DatePickerDialog dialog, char[] ymdOrder)
{
    if (!dialog.IsShowing)
    {
        return;
    }


     int idYear = Resources.GetIdentifier("year", "id", "android");
     int idMonth = Resources.GetIdentifier("month", "id", "android");
     int idDay = Resources.GetIdentifier("day", "id", "android");
     int idLayout = Resources.GetIdentifier("pickers", "id", "android");

     NumberPicker spinnerYear = (NumberPicker)dialog.FindViewById(idYear);
     NumberPicker spinnerMonth = (NumberPicker)dialog.FindViewById(idMonth);
     NumberPicker spinnerDay = (NumberPicker)dialog.FindViewById(idDay);
     LinearLayout layout = (LinearLayout)dialog.FindViewById(idLayout);

    layout.RemoveAllViews();
    for (int i = 0; i < SPINNER_COUNT; i++)
    {
        switch (ymdOrder[i])
        {
            case 'y':
                layout.AddView(spinnerYear);
                setImeOptions(spinnerYear, i);
                break;
            case 'm':
                layout.AddView(spinnerMonth);
                setImeOptions(spinnerMonth, i);
                break;
            case 'd':
                layout.AddView(spinnerDay);
                setImeOptions(spinnerDay, i);
                break;
        }
    }
}

private void setImeOptions(NumberPicker spinner, int spinnerIndex)
{
    ImeAction imeOptions;
    if (spinnerIndex < SPINNER_COUNT - 1)
    {
        imeOptions = inputMethos.ImeAction.Next;
    }
    else
    {
        imeOptions = inputMethos.ImeAction.Done;
    }
    int idPickerInput = Resources.GetIdentifier("numberpicker_input", "id", "android");
    TextView input = (TextView)spinner.FindViewById(idPickerInput);
    input.SetImeActionLabel("",imeOptions);
}
0 голосов
/ 07 октября 2019

DatePicker (Spinner) на Android по умолчанию соответствует выбранным настройкам на телефоне пользователя. Как правило, рекомендуется не игнорировать нативное поведение.

Однако вы можете переопределить это поведение, создав пользовательское средство визуализации для использования настраиваемого средства выбора даты, выполнив следующие шаги: https://stackoverflow.com/a/7208968/11104068

...