В моем приложении мне нужен Spinner с набором значений, например:
Пользователь выбирает одно из них и приложения отправляют запрос на сервер. Чтобы отправить запрос, мне нужно закодировать выбор пользователя как значение int:
В пользовательском интерфейсе эти значения локализованы и, что более важно, могут быть в другом порядке, в зависимости от локали, например:
Я хочу, чтобы все это было в локализуемом XML (поэтому команде локализации нужно будет редактировать только XML-файлы, а не код):
I потратил некоторое время на размышления над этой проблемой, и мое решение здесь.
В 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 () возвращает «разрешенный» идентификатор, поэтому, если некоторые редиректы будут задействованы целиком «если» не получится.
Я хочу услышать некоторые мнения об этом решении и посоветовать, как его можно реализовать другими способами.
Спасибо!
Обновление1:
Другое решение использует два строковых массива в 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" />
Что вы думаете об этом? Лучше не на первом? Может быть, другие способы реализовать такое?