มีวิธีใดบ้างในการกำหนดหมวดหมู่ขนาดหน้าจอของอุปกรณ์ปัจจุบันเช่นเล็ก, ปกติ, ใหญ่, xlarge?
ไม่ใช่ความหนาแน่น แต่เป็นขนาดหน้าจอ
มีวิธีใดบ้างในการกำหนดหมวดหมู่ขนาดหน้าจอของอุปกรณ์ปัจจุบันเช่นเล็ก, ปกติ, ใหญ่, xlarge?
ไม่ใช่ความหนาแน่น แต่เป็นขนาดหน้าจอ
คำตอบ:
คุณสามารถใช้Configuration.screenLayout
bitmask
ตัวอย่าง:
if ((getResources().getConfiguration().screenLayout &
Configuration.SCREENLAYOUT_SIZE_MASK) ==
Configuration.SCREENLAYOUT_SIZE_LARGE) {
// on a large screen device ...
}
รหัสด้านล่างนี้จะไม่ตอบคำถามข้างต้นโดยแสดงขนาดหน้าจอเป็นขนมปังปิ้ง
//Determine screen size
if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE) {
Toast.makeText(this, "Large screen", Toast.LENGTH_LONG).show();
}
else if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_NORMAL) {
Toast.makeText(this, "Normal sized screen", Toast.LENGTH_LONG).show();
}
else if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_SMALL) {
Toast.makeText(this, "Small sized screen", Toast.LENGTH_LONG).show();
}
else {
Toast.makeText(this, "Screen size is neither large, normal or small", Toast.LENGTH_LONG).show();
}
รหัสด้านล่างนี้แสดงความหนาแน่นของหน้าจอเป็นขนมปังปิ้ง
//Determine density
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int density = metrics.densityDpi;
if (density == DisplayMetrics.DENSITY_HIGH) {
Toast.makeText(this, "DENSITY_HIGH... Density is " + String.valueOf(density), Toast.LENGTH_LONG).show();
}
else if (density == DisplayMetrics.DENSITY_MEDIUM) {
Toast.makeText(this, "DENSITY_MEDIUM... Density is " + String.valueOf(density), Toast.LENGTH_LONG).show();
}
else if (density == DisplayMetrics.DENSITY_LOW) {
Toast.makeText(this, "DENSITY_LOW... Density is " + String.valueOf(density), Toast.LENGTH_LONG).show();
}
else {
Toast.makeText(this, "Density is neither HIGH, MEDIUM OR LOW. Density is " + String.valueOf(density), Toast.LENGTH_LONG).show();
}
คำตอบของ Jeff Gilfeltเป็นวิธีการช่วยเหลือแบบคงที่:
private static String getSizeName(Context context) {
int screenLayout = context.getResources().getConfiguration().screenLayout;
screenLayout &= Configuration.SCREENLAYOUT_SIZE_MASK;
switch (screenLayout) {
case Configuration.SCREENLAYOUT_SIZE_SMALL:
return "small";
case Configuration.SCREENLAYOUT_SIZE_NORMAL:
return "normal";
case Configuration.SCREENLAYOUT_SIZE_LARGE:
return "large";
case 4: // Configuration.SCREENLAYOUT_SIZE_XLARGE is API >= 9
return "xlarge";
default:
return "undefined";
}
}
private String getDeviceDensity() {
int density = mContext.getResources().getDisplayMetrics().densityDpi;
switch (density)
{
case DisplayMetrics.DENSITY_MEDIUM:
return "MDPI";
case DisplayMetrics.DENSITY_HIGH:
return "HDPI";
case DisplayMetrics.DENSITY_LOW:
return "LDPI";
case DisplayMetrics.DENSITY_XHIGH:
return "XHDPI";
case DisplayMetrics.DENSITY_TV:
return "TV";
case DisplayMetrics.DENSITY_XXHIGH:
return "XXHDPI";
case DisplayMetrics.DENSITY_XXXHIGH:
return "XXXHDPI";
default:
return "Unknown";
}
}
ขอบคุณสำหรับคำตอบข้างต้นที่ช่วยฉันได้มาก :-) แต่สำหรับผู้ที่ (เช่นฉัน) ที่ถูกบังคับให้ยังคงรองรับ Android 1.5 เราสามารถใช้การสะท้อนจาวาเพื่อรองรับการย้อนกลับ:
Configuration conf = getResources().getConfiguration();
int screenLayout = 1; // application default behavior
try {
Field field = conf.getClass().getDeclaredField("screenLayout");
screenLayout = field.getInt(conf);
} catch (Exception e) {
// NoSuchFieldException or related stuff
}
// Configuration.SCREENLAYOUT_SIZE_MASK == 15
int screenType = screenLayout & 15;
// Configuration.SCREENLAYOUT_SIZE_SMALL == 1
// Configuration.SCREENLAYOUT_SIZE_NORMAL == 2
// Configuration.SCREENLAYOUT_SIZE_LARGE == 3
// Configuration.SCREENLAYOUT_SIZE_XLARGE == 4
if (screenType == 1) {
...
} else if (screenType == 2) {
...
} else if (screenType == 3) {
...
} else if (screenType == 4) {
...
} else { // undefined
...
}
Configuration
คลาส เหล่านี้เป็นค่าสุดท้ายคงที่ที่จะถูก inlined ณ เวลารวบรวม (นั่นคือพวกเขาจะถูกแทนที่ด้วยค่าจริงของพวกเขา) ดังนั้นรหัสของคุณจะไม่ทำลายในแพลตฟอร์มรุ่นเก่า
targetSdkVersion
ให้เป็นรุ่นล่าสุด
หากคุณต้องการทราบความหนาแน่นของหน้าจอและขนาดของอุปกรณ์ Android คุณสามารถใช้แอพฟรีนี้ (ไม่ต้องขออนุญาต): https://market.android.com/details?id=com.jotabout.screeninfo
ต้องการตรวจสอบหน้าจอขนาดใหญ่ & x .. ความหนาแน่นสูงหรือไม่ นี่คือรหัสที่เปลี่ยนแปลงจากคำตอบที่เลือก
//Determine screen size
if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE) {
Toast.makeText(this, "Large screen",Toast.LENGTH_LONG).show();
} else if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_NORMAL) {
Toast.makeText(this, "Normal sized screen" , Toast.LENGTH_LONG).show();
} else if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_SMALL) {
Toast.makeText(this, "Small sized screen" , Toast.LENGTH_LONG).show();
} else if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE) {
Toast.makeText(this, "XLarge sized screen" , Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, "Screen size is neither large, normal or small" , Toast.LENGTH_LONG).show();
}
//Determine density
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int density = metrics.densityDpi;
if (density==DisplayMetrics.DENSITY_HIGH) {
Toast.makeText(this, "DENSITY_HIGH... Density is " + String.valueOf(density), Toast.LENGTH_LONG).show();
} else if (density==DisplayMetrics.DENSITY_MEDIUM) {
Toast.makeText(this, "DENSITY_MEDIUM... Density is " + String.valueOf(density), Toast.LENGTH_LONG).show();
} else if (density==DisplayMetrics.DENSITY_LOW) {
Toast.makeText(this, "DENSITY_LOW... Density is " + String.valueOf(density), Toast.LENGTH_LONG).show();
} else if (density==DisplayMetrics.DENSITY_XHIGH) {
Toast.makeText(this, "DENSITY_XHIGH... Density is " + String.valueOf(density), Toast.LENGTH_LONG).show();
} else if (density==DisplayMetrics.DENSITY_XXHIGH) {
Toast.makeText(this, "DENSITY_XXHIGH... Density is " + String.valueOf(density), Toast.LENGTH_LONG).show();
} else if (density==DisplayMetrics.DENSITY_XXXHIGH) {
Toast.makeText(this, "DENSITY_XXXHIGH... Density is " + String.valueOf(density), Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, "Density is neither HIGH, MEDIUM OR LOW. Density is " + String.valueOf(density), Toast.LENGTH_LONG).show();
}
นี่คือคำตอบของTom McFarlinรุ่น Xamarin.Android
//Determine screen size
if ((Application.Context.Resources.Configuration.ScreenLayout & ScreenLayout.SizeMask) == ScreenLayout.SizeLarge) {
Toast.MakeText (this, "Large screen", ToastLength.Short).Show ();
} else if ((Application.Context.Resources.Configuration.ScreenLayout & ScreenLayout.SizeMask) == ScreenLayout.SizeNormal) {
Toast.MakeText (this, "Normal screen", ToastLength.Short).Show ();
} else if ((Application.Context.Resources.Configuration.ScreenLayout & ScreenLayout.SizeMask) == ScreenLayout.SizeSmall) {
Toast.MakeText (this, "Small screen", ToastLength.Short).Show ();
} else if ((Application.Context.Resources.Configuration.ScreenLayout & ScreenLayout.SizeMask) == ScreenLayout.SizeXlarge) {
Toast.MakeText (this, "XLarge screen", ToastLength.Short).Show ();
} else {
Toast.MakeText (this, "Screen size is neither large, normal or small", ToastLength.Short).Show ();
}
//Determine density
DisplayMetrics metrics = new DisplayMetrics();
WindowManager.DefaultDisplay.GetMetrics (metrics);
var density = metrics.DensityDpi;
if (density == DisplayMetricsDensity.High) {
Toast.MakeText (this, "DENSITY_HIGH... Density is " + density, ToastLength.Long).Show ();
} else if (density == DisplayMetricsDensity.Medium) {
Toast.MakeText (this, "DENSITY_MEDIUM... Density is " + density, ToastLength.Long).Show ();
} else if (density == DisplayMetricsDensity.Low) {
Toast.MakeText (this, "DENSITY_LOW... Density is " + density, ToastLength.Long).Show ();
} else if (density == DisplayMetricsDensity.Xhigh) {
Toast.MakeText (this, "DENSITY_XHIGH... Density is " + density, ToastLength.Long).Show ();
} else if (density == DisplayMetricsDensity.Xxhigh) {
Toast.MakeText (this, "DENSITY_XXHIGH... Density is " + density, ToastLength.Long).Show ();
} else if (density == DisplayMetricsDensity.Xxxhigh) {
Toast.MakeText (this, "DENSITY_XXXHIGH... Density is " + density, ToastLength.Long).Show ();
} else {
Toast.MakeText (this, "Density is neither HIGH, MEDIUM OR LOW. Density is " + density, ToastLength.Long).Show ();
}
ลองใช้ฟังก์ชั่นนี้isLayoutSizeAtLeast (int screenSize)
ในการตรวจสอบหน้าจอขนาดเล็กอย่างน้อย 320x426 dp และสูงกว่า getResources (). getConfiguration (). isLayoutSizeAtLeast (Configuration.SCREENLAYOUT_SIZE_SMALL);
ในการตรวจสอบหน้าจอปกติอย่างน้อย 320x470 dp และสูงกว่า getResources (). getConfiguration (). isLayoutSizeAtLeast (Configuration.SCREENLAYOUT_SIZE_NORMAL);
ในการตรวจสอบหน้าจอขนาดใหญ่อย่างน้อย 480x640 dp และสูงกว่า getResources (). getConfiguration (). isLayoutSizeAtLeast (Configuration.SCREENLAYOUT_SIZE_LARGE);
ในการตรวจสอบหน้าจอขนาดใหญ่เป็นพิเศษอย่างน้อย 720x960 dp และสูงกว่า getResources (). getConfiguration (). isLayoutSizeAtLeast (Configuration.SCREENLAYOUT_SIZE_XLARGE);
ในปี 2561 ถ้าคุณต้องการคำตอบของเจฟฟ์ในคอตลินนี่คือ:
private fun determineScreenSize(): String {
// Thanks to https://stackoverflow.com/a/5016350/2563009.
val screenLayout = resources.configuration.screenLayout
return when {
screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK == Configuration.SCREENLAYOUT_SIZE_SMALL -> "Small"
screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK == Configuration.SCREENLAYOUT_SIZE_NORMAL -> "Normal"
screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK == Configuration.SCREENLAYOUT_SIZE_LARGE -> "Large"
screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK == Configuration.SCREENLAYOUT_SIZE_XLARGE -> "Xlarge"
screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK == Configuration.SCREENLAYOUT_SIZE_UNDEFINED -> "Undefined"
else -> error("Unknown screenLayout: $screenLayout")
}
}
คุณไม่สามารถทำได้โดยใช้ทรัพยากรสตริงและ enums หรือไม่ คุณสามารถกำหนดทรัพยากรสตริงที่มีชื่อขนาดหน้าจอเช่น SMALL, MEDIUM หรือ LARGE จากนั้นคุณสามารถใช้ค่าของทรัพยากรสตริงเพื่อสร้างอินสแตนซ์ของ enum
กำหนด Enum ในรหัสของคุณสำหรับขนาดหน้าจอที่แตกต่างกันที่คุณสนใจ
public Enum ScreenSize {
SMALL,
MEDIUM,
LARGE,;
}
กำหนดทรัพยากรสตริงพูดสกรีนขนาดที่มีค่าจะเป็นขนาดเล็กขนาดกลางหรือขนาดใหญ่
<string name="screensize">MEDIUM</string>
screensize
ทรัพยากรสตริงในแต่ละมิติที่คุณสนใจ <string name="screensize">MEDIUM</string>
จะไปใน values-sw600dp / strings.xml และ values-medium / strings.xml และ<string name="screensize">LARGE</string>
จะไปใน sw720dp / strings.xml และ values-large / strings.xmlScreenSize size = ScreenSize.valueOf(getReources().getString(R.string.screensize);
คัดลอกและวางรหัสนี้ในของคุณActivity
และเมื่อมีการดำเนินการมันจะToast
เป็นหมวดหมู่ขนาดหน้าจอของอุปกรณ์
int screenSize = getResources().getConfiguration().screenLayout &
Configuration.SCREENLAYOUT_SIZE_MASK;
String toastMsg;
switch(screenSize) {
case Configuration.SCREENLAYOUT_SIZE_LARGE:
toastMsg = "Large screen";
break;
case Configuration.SCREENLAYOUT_SIZE_NORMAL:
toastMsg = "Normal screen";
break;
case Configuration.SCREENLAYOUT_SIZE_SMALL:
toastMsg = "Small screen";
break;
default:
toastMsg = "Screen size is neither large, normal or small";
}
Toast.makeText(this, toastMsg, Toast.LENGTH_LONG).show();