Заполните Spinner, который отображает строки в числа из XML в Android - PullRequest
6 голосов
/ 27 октября 2011

В моем приложении мне нужно иметь Spinner с набором значений, например:

  • сегодня
  • завтра
  • после_ завтра

Пользователь выбирает один из них, и приложения отправляют запрос на сервер.Для отправки запроса мне нужно закодировать выбор пользователя в виде значения int:

  • Request.TODAY = 0;
  • Request.TOMORROW = 1;
  • Request.AFTER_TOMORROW= 2;

В пользовательском интерфейсе эти значения локализованы и, что более важно, могут быть в другом порядке, в зависимости от локали, например:

  • послезавтра (after_testival)
  • завтра (завтра)
  • сегодня (сегодня)

Я хочу, чтобы все это было в локализуемом XML (так что команда локализациинужно будет редактировать только XML-файлы, а не код):

  • строковые значения
  • строковый порядок

Я потратил некоторое время на обдумывание этой проблемы, имое решение здесь.

В strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="day_today">сегодня</string>
    <string name="day_tomorrow">завтра</string>
    <string name="day_after_tomorrow">послезавтра</string>
    <array name="day_values">
        <item>@string/day_after_tomorrow</item>
        <item>@string/day_tomorrow</item>
        <item>@string/day_today</item>
    </array>
</resources>

В layout.xml:

            <Spinner
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:id="@+id/day"
                    android:entries="@array/day_values" />

В MyActivity.java:

private int[] dayMap;
private Spinner uiDay;

private final void setupUI(Bundle savedInstanceState) {
    uiDay = (Spinner)findViewById(R.id.day);
    final TypedArray dayValues = getResources().obtainTypedArray(R.array.day_values);
    dayMap = new int[dayValues.length()];
    for (int i = 0; dayMap.length > i; ++i) {
        final int r = dayValues.getResourceId(i, 0);
        // can't use switch() since resources ids not always final since Android 4
        if (R.string.day_today == r) {
            dayMap[i] = Request.TODAY;
        } else if (R.string.day_tomorrow == r) {
            dayMap[i] = Request.TOMORROW;
        } else if (R.string.after_tomorrow == r) {
            dayMap[i] = Request.AFTER_TOMORROW;
        }
    }
    dayValues.recycle();
}

public void submitClicked(View v) {
    final int r = dayMap[uiDay.getSelectedItemPosition()];
    submitDayRequest(r);
}

Я вижу только одну плохую вещь в этом решении - TypedArray.getResourceId () возвращает «решенный» идентификатор, поэтому, если некоторые перенаправления будут задействованы«Если» не сработает.

Я хочу услышать некоторые мнения об этом решении и дать советы о том, как его можно реализовать другими способами.

Спасибо!

Update1:

Другое решение использует два строковых массива в XML-файле.

strings.xml:

<string-array name="day_entries">
    <item>послезавтра</item>
    <item>завтра</item>
    <item>сегодня</item>
</string-array>
<string-array name="day_values">
    <item>after_tomorrow</item>
    <item>tomorrow</item>
    <item>today</item>
</string-array>

MyActivity.java:

private static final Map<String, Integer> DAYS;

static {
    DAYS = new HashMap<String, Integer>();
    DAYS.put("today", Request.TODAY);
    DAYS.put("tomorrow", Request.TOMORROW);
    DAYS.put("after_tomorrow", Request.AFTER_TOMORROW);
}

private Spinner uiDay;
private String[] dayValues;

private final void setupUI(Bundle savedInstanceState) {
    uiDay = (Spinner)findViewById(R.id.day);
    dayValues = getResources().getStringArray(R.array.day_values);
}

public void submitClicked(View v) {
    final int r = DAYS.get(dayValues[uiDay.getSelectedItemPosition()]);
    submitDayRequest(r);
}

layout.xml:

            <Spinner
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:id="@+id/day"
                    android:entries="@array/day_entries" />

Что вы думаете об этом?Это лучше, чем первый?Может быть, другие способы реализовать такую ​​вещь?

1 Ответ

1 голос
/ 11 ноября 2013

Я бы предложил вам использовать второй метод.Мудрая локализация - это здорово, и вы тоже получаете желаемый результат.

...