วิธีการกำหนดหมวดหมู่ขนาดหน้าจอของอุปกรณ์ (เล็ก, ปกติ, ใหญ่, ใหญ่) โดยใช้รหัส?


308

มีวิธีใดบ้างในการกำหนดหมวดหมู่ขนาดหน้าจอของอุปกรณ์ปัจจุบันเช่นเล็ก, ปกติ, ใหญ่, xlarge?

ไม่ใช่ความหนาแน่น แต่เป็นขนาดหน้าจอ

คำตอบ:


420

คุณสามารถใช้Configuration.screenLayoutbitmask

ตัวอย่าง:

if ((getResources().getConfiguration().screenLayout & 
    Configuration.SCREENLAYOUT_SIZE_MASK) == 
        Configuration.SCREENLAYOUT_SIZE_LARGE) {
    // on a large screen device ...

}

31
ในการรับการตรวจจับขนาดใหญ่ตรวจสอบให้แน่ใจว่าคุณใช้ android-3.0 เป้าหมายในโครงการของคุณ หรือใช้ค่าคงที่ 4 สำหรับ x-large
Peterdk

5
อุปกรณ์บางอย่างสามารถมีขนาด UNDEFINED ของหน้าจอดังนั้นอาจมีประโยชน์ตรวจสอบด้วยการกำหนดค่า SCREENLAYOUT_SIZE_UNDEFINED
valerybodak

คุณสามารถใช้> = เพื่อทำให้หน้าจอใหญ่ขึ้นหรือไม่?
Andrew S

150

รหัสด้านล่างนี้จะไม่ตอบคำถามข้างต้นโดยแสดงขนาดหน้าจอเป็นขนมปังปิ้ง

//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();
}

ขนมปังเป็นสิ่งที่ดีสำหรับการพัฒนา
MinceMan

บางคนสามารถยืนยันขนาดใหญ่พิเศษได้หรือไม่
นาธาน H

68

คำตอบของ 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";
    }
}

12
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";
    }
}

1
นี่ทำให้หน้าจอมีความหนาแน่น คำถามระบุว่า "ไม่ใช่ความหนาแน่น แต่เป็นขนาดหน้าจอ"
Subaru Tashiro

11

ขอบคุณสำหรับคำตอบข้างต้นที่ช่วยฉันได้มาก :-) แต่สำหรับผู้ที่ (เช่นฉัน) ที่ถูกบังคับให้ยังคงรองรับ 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
    ...
}

2
คุณสามารถกำหนดเป้าหมายเวอร์ชันล่าสุดของแพลตฟอร์มและอ้างอิงค่าคงที่จากConfigurationคลาส เหล่านี้เป็นค่าสุดท้ายคงที่ที่จะถูก inlined ณ เวลารวบรวม (นั่นคือพวกเขาจะถูกแทนที่ด้วยค่าจริงของพวกเขา) ดังนั้นรหัสของคุณจะไม่ทำลายในแพลตฟอร์มรุ่นเก่า
Karakuri

ดีฉันไม่ทราบว่า ... คุณกำลังพูดถึง android: targetSdkVersion?
A. Masson

1
ใช่นั่นเป็นวิธีที่คุณจะกำหนดเป้าหมายเวอร์ชันเฉพาะ คนส่วนใหญ่ (อย่างน้อยที่สุดที่ฉันเคยเห็น) ตั้งtargetSdkVersionให้เป็นรุ่นล่าสุด
Karakuri

9

หากคุณต้องการทราบความหนาแน่นของหน้าจอและขนาดของอุปกรณ์ Android คุณสามารถใช้แอพฟรีนี้ (ไม่ต้องขออนุญาต): https://market.android.com/details?id=com.jotabout.screeninfo


3
คำถามนี้ไม่เกี่ยวกับอุปกรณ์เฉพาะ แต่เกี่ยวกับการเขียนโปรแกรมสำหรับโปรไฟล์ divice หลายอัน (ซึ่งเป็นกระบวนการพัฒนาซอฟต์แวร์ที่สำคัญเมื่อพัฒนาสำหรับแพลตฟอร์มมือถือ)
mtmurdock

1
แอปที่ดีที่รู้มีอยู่ในตลาด - และจะเป็นการดีที่จะเห็นรหัสที่แอปใช้เพื่อหาข้อมูลของมัน
Stan Kurdziel

4
@StanKurdziel ซอร์สโค้ดเผยแพร่ภายใต้ใบอนุญาตโอเพ่นซอร์สของ MIT และมีให้ที่: github.com/mportuesisf/ScreenInfo
mmathieum

ลิงค์นี้ตายแล้วตอนนี้
Vadim Kotov

5

ต้องการตรวจสอบหน้าจอขนาดใหญ่ & 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();
}

[ความหนาแน่น] ในกรณีนี้คุณต้องมีกิจกรรม ถ้าคุณอยู่นอกใช้ getWindowManager () รหัสนี้ WindowManager รหัส windowManager = (WindowManager) บริบท. getSystemService (Context.WINDOW_SERVICE);
horkavlna

3

นี่คือคำตอบของ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 ();
        }

2
โปรดอย่าเพิ่งทิ้งโค้ด แต่อธิบายว่าคุณทำอะไรไปแล้วและมันจะช่วยได้อย่างไร
David Medenjak

2

ลองใช้ฟังก์ชั่นนี้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);


ดี! วิธีนั้นใช้ได้ตั้งแต่ช่วงต้นของ API ระดับ 11 เช่นกัน!
Enselic

2

ในปี 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")
    }
  }

1

คุณไม่สามารถทำได้โดยใช้ทรัพยากรสตริงและ enums หรือไม่ คุณสามารถกำหนดทรัพยากรสตริงที่มีชื่อขนาดหน้าจอเช่น SMALL, MEDIUM หรือ LARGE จากนั้นคุณสามารถใช้ค่าของทรัพยากรสตริงเพื่อสร้างอินสแตนซ์ของ enum

  1. กำหนด Enum ในรหัสของคุณสำหรับขนาดหน้าจอที่แตกต่างกันที่คุณสนใจ

    public Enum ScreenSize {
        SMALL,
        MEDIUM,
        LARGE,;
    }
  2. กำหนดทรัพยากรสตริงพูดสกรีนขนาดที่มีค่าจะเป็นขนาดเล็กขนาดกลางหรือขนาดใหญ่

    <string name="screensize">MEDIUM</string>
  3. ใส่สำเนาของ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.xml
  4. ในรหัสเขียน
    ScreenSize size = ScreenSize.valueOf(getReources().getString(R.string.screensize);

นี่เป็นสิ่งที่น่าสัญญา ... อย่างไรก็ตามฉันได้ทดสอบกับอุปกรณ์ 3 ชิ้นและแท็บเล็ตยังคงส่งคืนขนาดเล็กเมื่อฉันคาดหวังว่าจะมีขนาดใหญ่ ไฟล์ string.xml ของฉันถูกกำหนดไว้ใน values-h1024dp, values-h700dp และ values-h200dp พร้อมกับ <string name = "screensize"> xxxxxx </string> ที่สอดคล้องกัน
A. Masson

1

คัดลอกและวางรหัสนี้ในของคุณ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();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.