我的应用程序中有一个微调器,用户选择是否要搜索"包含" "从"开始"结束"或"等于",用户选择的选项存储在带有其他信息的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
中,因为我知道哪个选项是哪个位置,但这看起来非常麻烦,有没有什么方法可以解决这个更优雅的问题?
答案 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>