不同屏幕尺寸的不同日期格式
Different date format for different screen sizes
我的 android 应用程序可以 运行 在桌子上和 phone 上(阅读 - 大屏幕和小屏幕)。在我的整个应用程序中,我根据需要使用不同的资源(布局、尺寸、样式、字符串),方法是将它们适当地放置在 values
或 values-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);
我的 android 应用程序可以 运行 在桌子上和 phone 上(阅读 - 大屏幕和小屏幕)。在我的整个应用程序中,我根据需要使用不同的资源(布局、尺寸、样式、字符串),方法是将它们适当地放置在 values
或 values-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);