Android:语言支持、微调器选项

标签 android android-spinner

我的应用程序中有一个微调器,用户可以选择是否要按“包含”、“开头为”、“结尾为”或“等于”进行搜索,用户选择的选项将与其他信息一起存储到 json 中并发送到服务器检索结果。现在我正在使用:

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

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

    <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>

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

最佳答案

您可以将所选元素的索引发送到服务器,但这不是一个好方法,没有告知索引的原因。更好的方法是将可读的字符串 key 发送到服务器。请参阅以下代码:

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()];

关于Android:语言支持、微调器选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24133714/

相关文章:

android - 为什么 fragment 类可能无效?

android - 有没有办法在 Activity 组中的 Activity 之间传递数据?

android - Phonegap 数据库选项、IndexedDB、SQLite?

android - 彼此相邻的两个微调器

android - Etsy 的 StaggeredGridview 是否可以在 API 9 中工作?

android - DateTime 是可序列化的,但序列化不正确?

java - 使用两个 android 微调器,一个依赖于另一个

java - 如何获取ListView中显示的Spinners的值?

android - 设置适配器时如何避免让android微调器调用onitemselectedlistener?

android - inflate 方法的两种不同签名之间的区别