我想确定当前设备的代码中是否有小,中,大或xlarge屏幕。我在SDK文档中找不到任何可以帮助我获取该信息的内容。我所看到的所有方法/类只提供绝对值(即屏幕大小,以像素为单位,屏幕密度等)。
有没有办法告诉我在代码中运行的是什么类型的屏幕?
答案 0 :(得分:56)
我最终使用放置在不同存储桶文件夹中的bool
资源。我只需要区分普通(小/中)和大(大/大)屏幕,所以我这样做了:
<强>值/ bools.xml 强>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="screen_large">false</bool>
</resources>
<强>值-大/ bools.xml 强>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="screen_large">true</bool>
</resources>
然后,我只需拨打getBoolean(R.bool.screen_large)
来判断屏幕是否大。通过这种方式,平台可以100%决定设备的屏幕。
答案 1 :(得分:7)
密度和屏幕类型之间存在差异。
由于您可以获得像素和密度,因此您始终可以使用静态Helper类来确定它。
您可以使用
将像素转换为dppublic static float dpFromPixels(int pixels) {
float dp = (float) ((pixels) / Density.scale);
return dp;
}
我认为您可能想要从像素中添加或减去.5f,因为从dp获取像素来自该代码。
public static int pixelsFromDp(float dps) {
int pixels = (int) (dps * Density.scale + 0.5f);
return pixels;
}
xlarge屏幕至少为960dp x 720dp
大屏幕至少为640dp×480dp
正常屏幕至少为470dp×320dp
小屏幕至少为426dp x 320dp
答案 2 :(得分:6)
public static boolean isLargeScreen(Context context) {
int screenSize = context.getResources().getConfiguration().screenLayout
& Configuration.SCREENLAYOUT_SIZE_MASK;
return screenSize >= Configuration.SCREENLAYOUT_SIZE_LARGE;
}
答案 3 :(得分:5)
我同意Felix的回答非常优雅。但我认为我在这篇文章中找到的方式可能更容易How to determine device screen size category (small, normal, large, xlarge) using code?
答案 4 :(得分:1)
使用DisplayMetrics
类......
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
// DENSITY_LOW, DENSITY_MEDIUM, DENSITY_HIGH, or DENSITY_XHIGH
int density = dm.densityDpi;
小= DisplayMetrics.DENSITY_LOW
中= DisplayMetrics.DENSITY_MEDIUM
大= DisplayMetrics.DENSITY_HIGH
XLarge = DisplayMetrics.DENSITY_XHIGH
答案 5 :(得分:1)
我在我的代码中使用这种方法来区分“大屏幕”(我认为是平板电脑)和“小屏幕”(我认为是手机)。
public static boolean isLargeScreen(Configuration toCheckConfig) {
int screenSizeBucket = toCheckConfig.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK;
if (screenSizeBucket >= Configuration.SCREENLAYOUT_SIZE_LARGE) {
return true;
}
else return false;
}
Configuration
对象还包含SCREENLAYOUT_SIZE_SMALL
,SCREENLAYOUT_SIZE_XLARGE
等(如果您特别需要测试大小存储区)。
这也适用于这两个util函数:
public static int getPixelsFromDp(Context context, int dpValue) {
return (int) (context.getResources().getDisplayMetrics().density * dpValue);
}
public static int getDpfromPixels(Context context, int pixels) {
return (int) (pixels / context.getResources().getDisplayMetrics().density);
}
其中context.getResources().getDisplayMetrics().density
等于1.0
,1.5
,2.0
(mdpi
,hdpi
,xhdpi
。
答案 6 :(得分:1)
作为Felix答案的补充,您可以使用以下代码获取ScreenSize,而无需为值创建任何文件夹-XXX:
int screenSize = getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK;
Log.d(TAG, "screenSize = "+screenSize);
switch(screenSize) {
case Configuration.SCREENLAYOUT_SIZE_LARGE:
Log.d(TAG, "Large Screen");
break;
case Configuration.SCREENLAYOUT_SIZE_NORMAL:
Log.d(TAG, "Normal Screen");
break;
case Configuration.SCREENLAYOUT_SIZE_SMALL:
Log.d(TAG, "Small Screen");
break;
case Configuration.SCREENLAYOUT_SIZE_XLARGE :
Log.d(TAG, "XLarge Screen");
break;
default:
Log.d(TAG, "Screen size is neither large, normal or small or xlarge");
}
答案 7 :(得分:-1)
DisplayMetrics
已经得到了你所需要的一切。得到它
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);