我的应用程序中有一个微调器,用户可以选择是否要按“包含”、“开头为”、“结尾为”或“等于”进行搜索,用户选择的选项将与其他信息一起存储到 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/