填充Spinner,将字符串映射到Android中的XML数字

won*_*ice 6 resources android localization spinner

在我的应用程序中,我需要让Spinner具有一组值,例如:

  • 今天
  • 明天
  • 明天之后

用户选择其中一个,应用程序向服务器发送请求.要发送请求,我需要将用户的选择编码为int值:

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

在UI中,这些值是本地化的,更重要的是,它们可以按不同的顺序排列,具体取决于区域设置,例如:

  • послезавтра(after_tomorrow)
  • завтра(明天)
  • сегодня(今天)

我想要的是将所有这些东西都放在可本地化的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>
Run Code Online (Sandbox Code Playgroud)

在layout.xml中:

            <Spinner
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:id="@+id/day"
                    android:entries="@array/day_values" />
Run Code Online (Sandbox Code Playgroud)

在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);
}
Run Code Online (Sandbox Code Playgroud)

我在该解决方案中只看到一件坏事 - TypedArray.getResourceId()返回"已解决"的id,因此如果涉及某些重定向,则整个"if"将无效.

我希望听到有关该解决方案的一些意见,并建议如何以其他方式实施该解决方案.

谢谢!

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>
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

layout.xml:

            <Spinner
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:id="@+id/day"
                    android:entries="@array/day_entries" />
Run Code Online (Sandbox Code Playgroud)

你怎么看待这件事?是不是比第一个更好?也许其他方式来实现这样的事情?

d3m*_*h3r 0

我建议你使用第二种方法。本地化方面它很棒,您也得到了想要的结果。