Android:语言支持,微调选项

时间:2014-06-10 05:47:01

标签: android android-spinner

我的应用程序中有一个微调器,用户选择是否要搜索"包含" "从"开始"结束"或"等于",用户选择的选项存储在带有其他信息的json中,并发送到服务器以检索结果。现在我正在使用:

String searchtypeval=searchtype.getSelectedItem().toString();

并将searchtypeval添加到我的json中。 微调器中的String数组是

    <string-array name="search_options">
        <item>Starts With</item>
        <item>Equals</item>
        <item>Ends With</item>
        <item>Contains</item>
    </string-array>

但现在我正在添加语言支持,所以在values-fr/strings.xml中,该微调器的字符串数组是

<string-array name="search_options">
    <item>Commence par </item>
    <item>Égal </item>
    <item>Se termine par </item>
    <item>Contient </item>
</string-array>

现在,如果用户选择法语等于,则 Egal 存储在JSON中,当然服务器不接受。有什么方法可以在法语和英语strings.xml之间建立联系吗?我现在能想到的就是使用searchtype.getSelectedItemPosition() 并且将值硬编码到String searchtypeval中,因为我知道哪个选项是哪个位置,但这看起来非常麻烦,有没有什么方法可以解决这个更优雅的问题?

2 个答案:

答案 0 :(得分:2)

您可以向服务器发送所选元素的索引,但这不是一个好方法,索引的原因不会被提供信息。更好的方法是将可读的字符串密钥发送到服务器。请参阅以下代码:

1)在 res / values

中创建文件 nontranslatable_string.xml
<resources>

 <string-array name="search_options_keys">
        <item>Starts With</item>
        <item>Equals</item>
        <item>Ends With</item>
        <item>Contains</item>
    </string-array>

</resources>

2)创建您的Item类,如 SpinnerItem

public class SpinnerItem {

 public final String key;
 public final String value;

 private SpinnerItem(String key, String value) {
  this.key = key;
  this.value = value;
 }

 public static SpinnerItem create(String key, String value) {
  return new SpinnerItem(key, value);
 }

 @Override
 public String toString() {
  return value;
 }

}

3)用值

填充你的适配器
   String[] keys = context.getResources().getStringArray(R.id.search_options_keys);
   String[] values = context.getResources().getStringArray(R.id.search_options);

   List<SpinnerItem> items = new ArrayList<SpinnerItem>();

   for (int i = 0; i < keys.length; i++) {
    items.add(SpinnerItem.create(keys[i], values[i]));
   }

   spinner.setAdapter(new ArrayAdapter<SpinnerItem>(context, android.R.layout.simple_spinner_item, android.R.id.text1, items));

4)选择你的价值

String valueForSendingToServer = ((SpinnerItem) spinner.getSelectedItem()).key;

<强>更新

或者您可以使用其他方式获取您使用的任何位置的必要值:

      Configuration config = context.getResources().getConfiguration();

      // Save originla location
      Locale originalLocal = config.locale;

      // Set new one for single using 
      config.locale = new Locale("en");
      context.getResources().updateConfiguration(config, null);

      // Get search_options array for english values
      String[] searchOptionsEn = getResources().getStringArray(R.array.search_options);

      // Set previous location back
      config.locale = originalLocal;
      getResources().updateConfiguration(config, null);

      String valueForSendingToServer = searchOptionsEn[spinner.getSelectedItemPosition()];

答案 1 :(得分:0)

您可以在字符串数组中引用字符串资源以进行本地化。

<string-array name="search_options">
    <item>@string/starts_with</item>
    <item>@string/equals</item>
    <item>@string/ends_with</item>
</string-array>

然后在 res / values / strings.xml

<string name="starts_with">Starts with </string>

并在 res / values-fr / string.xml

<string name="starts_with">Commence par </string>