在Android中将本地化用户输入映射为内部价值的最佳做法?

时间:2019-01-28 10:21:16

标签: java android localization user-input

在我的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>的密钥,那将是很好的。

我觉得这是本地化应用程序中的常见问题,应该有一些通用的解决方案-我只是想不到如何。

1 个答案:

答案 0 :(得分:0)

我用于这种类型的本地化问题的解决方案是使用Pair对象或创建POJO(如果我需要存储的数据不仅仅是两件事)。

但是对于您而言,Pair应该可以正常工作。您可以这样创建一个:

Pair<String, String> pair = new Pair<>(INTERNAL_STRING, LOCALIZED_STRING);

基本上,您将传入Pair对象的数组或列表,而不仅仅是将数组或字符串列表传递到Spinner的适配器中。每个Pair对象将拥有本地化的String和一个内部String。

当然,这确实需要为Spinner使用自定义适配器,但是如果您尚未使用自定义适配器,则创建它并不难。在自定义Spinner适配器中,只需让它显示Pair对象中的本地化String。

然后,当您获得结果时,只需从返回给您的Pair对象中获取内部String即可。

在检索用户结果时,这两种解决方案都需要进行过多检查,如果您的数据集大于简单的Genders,则可能会变得非常忙碌。想象一下,如果您的微调框用于o.o

国家,则需要所有if语句

因此,使用此解决方案,无需执行任何检查。您只需要检索已经存储的内部值。本地化的String和内部的String之间存在区别,这使您可以轻松快捷地检索任一String以便在应用程序中使用。