我的Android应用程序可以在桌面和手机上运行(阅读 - 大屏幕和小屏幕)。在我的应用中,我会根据需要使用不同的资源(布局,尺寸,样式,字符串),并将其放在values
或values-sw600dp
中。
我努力解决的一个因素是日期格式。我在几个地方使用DateFormat.LONG
(例如, 2015年11月15日)。这在大屏幕上工作并且看起来非常好,但是在小型电话屏幕上,整个文本不适合并且它被截断。为了解决这个问题,我想对小屏幕使用不同的格式,例如: DateFormat.MEDIUM
(这会让我Nov 15, 2015
适合小屏幕。)
我可以动态确定屏幕大小并使用一种格式或另一种格式。这感觉效率相当低,我宁愿在资源中指定格式,以便以后可以轻松更改 - 但我无法找到实现此目的的方法。我可以想到一些黑客 - 但它们确实是黑客(例如在字符串资源中存储字符串LONG
,然后在运行时使用反射来查找LONG
中名为DateFormat
的字段并获取其值)。
那么,是否有一种简单的方法可以在资源中存储内置日期格式的指示符?
答案 0 :(得分:0)
使用类似的东西:
首先approuch: DateFormat.format(getResources()。getString(R.string.main_data_format),data.getTime())。toString();
在资源中,您将包含不同屏幕的格式。
第二种方法: java.text.DateFormat.getDateInstance(getResources()getInteger(R.integer.data_format_style));
其中integer是以下之一:
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类中定义map方法:
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));
答案 1 :(得分:0)
我最终最终使用了反射,因为它为我提供了最容易改变事物的灵活性。这就是我现在得到的:
在 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);