不同屏幕尺寸的不同日期格式

Different date format for different screen sizes

我的 android 应用程序可以 运行 在桌子上和 phone 上(阅读 - 大屏幕和小屏幕)。在我的整个应用程序中,我根据需要使用不同的资源(布局、尺寸、样式、字符串),方法是将它们适当地放置在 valuesvalues-sw600dp 中。

我正在努力解决的一个问题是日期格式。在几个地方我使用 DateFormat.LONG(例如,2015 年 11 月 15 日 )。这在大屏幕上工作并且看起来非常好,但是在小 phone 屏幕上,整个文本不适合并且它被 t运行 处理。为了解决这个问题,我想为小屏幕使用不同的格式,例如DateFormat.MEDIUM(这会让我 Nov 15, 2015 适合小屏幕)。

我可以动态确定屏幕尺寸并使用一种格式或另一种格式。这感觉效率很低,我更愿意在资源中指定格式,以便以后可以轻松更改它 - 但我找不到执行此操作的方法。我能想到一些技巧——但它们确实是技巧(例如,将字符串 LONG 存储在字符串资源中,然后在 运行 时间使用反射在 [=17] 中查找名为 LONG 的字段=] 并获取它的值)。

那么,有没有一种简单的方法可以在资源中存储内置日期格式的指标?

使用这样的东西:

第一次接近: DateFormat.format(getResources().getString(R.string.main_data_format), data.getTime()).toString();

并且在资源中,您将包含适用于不同屏幕的格式。

第二种方法: java.text.DateFormat.getDateInstance(getResources().getInteger(R.integer.data_format_style));

其中整数是以下之一:

public static final int DEFAULT = 2;
public static final int FULL = 0;
public static final int LONG = 1;
public static final int MEDIUM = 2;
public static final int SHORT = 3;

取决于哪种格式适用于哪种屏幕尺寸。

为避免将来更改 API 时出现问题,您可以在默认值中准备自己的一组常量:

   <resource>
   <integer name="data_format_default">202</integer>
   <integer name="data_format_full">200</integer>
   <integer name="data_format_long">201</integer>
   <integer name="data_format_medium">202</integer>
   <integer name="data_format_short">203</integer>
    </resource>

然后为每个屏幕尺寸定义引用以上之一的 int 值:

<integer name="foobar__format_style">@integer/data_format_medium</integer>

在同一个 util class 中定义映射方法:

public class Utils {
public static final int getDataFormatStyle(int data_format_style_from_resource){
         switch(data_format_style_from_resource) {
             case data_format_full:  return DataFormat.FULL:
             case data_format_long:  return DataFormat.LONG:
             case data_format_medium:  return DataFormat.MEDIUM:
             case data_format_short:  return DataFormat.SHORT:
             default:  return DataFormat.DEFAULT:
         }    
    }
}

然后像这样使用它们:

final int style = getResources().getInteger(R.integer.foobar__format_style);
DateFormat.getDateInstance(Utils.getDataFormatStyle(style));

我最终使用了反射,因为它给了我最大的灵活性来轻松地改变事情。这是我现在得到的:

strings.xml:

<string name="title_date_format">LONG</string>

在我的代码中:

String formatString = getString(R.string.title_date_format);
int style = DatFormat.class.getField(formatString).getInt(null);
DateFormat format = DateFormat.getDateInstance(style);