在我的Android应用程序中,我有一个带有下拉菜单的设置"活动",用户可以在其中设置自己的偏好,例如性别。下拉菜单包含几个本地化形式的选项,比如德语中的女性、男性和其他选项:"Weiblich"、"Männlich"、"Andere"。
如何将视图中的本地化字符串转换为可以存储在服务器上的内部表示形式,反之亦然,将服务器中的值转换为本地化字符串?
到目前为止,我所想到的只是一个硬编码的if-else语句,这似乎是个坏主意:
private String getSelectedGender() {
String selectedGender = genderSpinner.getSelectedItem().toString();
if (selectedGender.equals(getResources().getString(R.string.Female))) {
return "female";
} else if // ...
// ...
}
另一种方式也是如此,从内部代表到视图:
private void setGenderInView(User user) {
String gender = user.getGender();
String localizedGender;
if (gender.equalsIgnoreCase("female")) {
localizedGender = getResources().getString(R.string.Male);
} //...
}
如果我能得到资源<string name="female">Weiblich</string>
的密钥就太好了。
我觉得这是本地化应用程序中的一个常见问题,应该有一些通用的解决方案——我只是想不出如何解决。
我用于这类本地化问题的解决方案是,如果我需要存储比两件事更多的数据,则使用Pair
对象或创建POJO。
但对于您的情况,Pair
应该可以正常工作。你可以创建这样一个:
Pair<String, String> pair = new Pair<>(INTERNAL_STRING, LOCALIZED_STRING);
基本上,您不只是将字符串的数组或列表传递到Spinner的适配器中,而是将Pair
对象的数组或清单传递给Spinner。每个Pair
对象都将拥有本地化的String和一个内部String。
当然,这确实需要为Spinner提供一个自定义适配器,但如果您还没有使用自定义适配器,那么创建一个适配器并不困难。在您的自定义Spinner适配器中,您只需让它显示Pair对象中的本地化字符串。
然后,当您获得结果时,只需从返回给您的Pair
对象中获取内部String。
在检索用户的结果时,您的两种解决方案都需要进行过多的检查,如果您的数据集比简单的Gender大,这可能会非常繁忙。想象一下,如果您的Spinner用于国家o.o ,则需要所有的If Statements
因此,使用此解决方案,无需执行任何检查。您只需要检索已经存储的内部值。本地化字符串和内部字符串之间有区别,这使得您可以快速轻松地检索任何一个字符串以在应用程序中使用。