使用区域设置来检测是否使用英制单位

我正在开发一个应用程序,希望以厘米(cm)或英寸(“)显示长度。有没有办法从本地select正确的单位?无论如何,我也要放入选项,以便用户可以覆盖区域设置。

美国,利比里亚和缅甸应该使用帝国单位和其他世界正常单位。 一种方法是把这个逻辑放在我自己的类中,但是如果可用的话我更喜欢使用任何内置的逻辑。 任何指针?

  • 可以使用drawable-mdpi-fr,drawable-hdpi-fr,drawable-ldpi-fr来进行不同分辨率的本地化
  • CyanogenMod:翻译一个项目
  • 为什么Resources.getString()会间歇地从错误的语言环境返回string?
  • 任何工具将Android的XML本地化转换为iPhone的.strings文件?
  • 如何在Android上创build本地化的时间string
  • Lint:如何忽略“<key>没有翻译成<language>”的错误?
  • 如何使用设备货币格式格式化浮点值?
  • dynamicAndroid应用本地化
  • 最后我去了下面的解决scheme。

    public class UnitLocale { public static UnitLocale Imperial = new UnitLocale(); public static UnitLocale Metric = new UnitLocale(); public static UnitLocale getDefault() { return getFrom(Locale.getDefault()); } public static UnitLocale getFrom(Locale locale) { String countryCode = locale.getCountry(); if ("US".equals(countryCode)) return Imperial; // USA if ("LR".equals(countryCode)) return Imperial; // liberia if ("MM".equals(countryCode)) return Imperial; // burma return Metric; } } 

    例如像这样使用它。

     if (UnitLocale.getDefault() == UnitLocale.Imperial) convertToimperial(); 

    如果还需要convert方法,则最好将它们添加到UnitLocale的子类中。 我只需要检测使用英制单位,并将其发送到服务器。

    使用int对java对象的性能提升非常微弱,代码难以阅读。 在Java中比较两个引用可以比较两个ints速度。 还使用对象允许我们将方法添加到UnitLocale类或子类,如convertToMetric等。

    如果您喜欢,也可以使用枚举。

    只要给用户在设置菜单中select首选设备的选项。 如果是旅行用户,您不希望应用程序在地理位置上知晓IMO。

    1. 编程

    在@vidstige的解决scheme中做一些小的改进

    我将使用getCountry()。toUpperCase()来保证安全,并将检查更改为更清晰的代码。 像这样的东西:

     public static UnitLocale getFrom(Locale locale) { String countryCode = locale.getCountry().toUpperCase(); switch (countryCode) { case "US": case "LR": case "MM": return Imperial; default: return Metric; } } 
    1. 从资源

    另一个解决scheme可能是为每个国家创build资源文件夹,如:[values_US] [values_LR] [values_MM],布尔资源更改为true。 然后从代码中读取该布尔资源。