코드를 사용하여 장치 화면 크기 범주 (작은, 보통, 큰, 큰)를 확인하는 방법은 무엇입니까?


308

소형, 일반, 대형, 대형과 같은 현재 장치의 화면 크기 범주를 결정하는 방법이 있습니까?

밀도가 아니라 화면 크기입니다.

답변:


420

Configuration.screenLayout비트 마스크 를 사용할 수 있습니다 .

예:

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

}

31
x- 큰 감지를하려면 프로젝트에서 target android-3.0을 사용해야합니다. 또는 x-large에 정적 값 4를 사용하십시오.
Peterdk

5
일부 장치는 UNDEFINED 크기의 화면을 가질 수 있으므로 Configuration.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

누군가 초대형을 확인할 수 있습니까?
Nathan 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
화면의 밀도를 얻습니다. 질문은 "밀도가 아니라 화면 크기"를 지정합니다.
스바루 타시로

11

위의 답변에 감사드립니다. 저에게 많은 도움이되었습니다.

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클래스 의 상수를 참조 할 수 있습니다 . 이들은 컴파일 타임에 인라인되는 정적 최종 값이므로 실제 값으로 대체되므로 코드는 이전 버전의 플랫폼에서 중단되지 않습니다.
Karakuri

니스 : 몰랐어 ... android : targetSdkVersion에 대해 이야기하고 있습니까?
A. Masson

1
예, 특정 버전을 타겟팅하는 방법입니다. 대부분의 사람들 (적어도 내가 본 것) targetSdkVersion은 최신 릴리스로 설정했습니다 .
Karakuri

9

Android 기기의 화면 밀도와 크기를 쉽게 알고 싶다면이 무료 앱을 사용할 수 있습니다 (권한 필요 없음) : https://market.android.com/details?id=com.jotabout.screeninfo


3
이 질문은 특정 디바이스, 다중 다이 프로파일 프로파일 프로그래밍에 관한 것이 아닙니다 (이는 모바일 플랫폼 용으로 개발할 때 중요한 소프트웨어 개발 프로세스 임).
mtmurdock

1
알아야 할 좋은 응용 프로그램은 시장에서 구할 수 있습니다-또한 응용 프로그램이 정보를 제공하는 데 사용하는 코드를 보는 것이 좋을 것입니다
Stan Kurdziel

4
@StanKurdziel 소스 코드는 MIT 오픈 소스 라이센스에 따라 공개되며 github.com/mportuesisf/ScreenInfo
mmathieum에서

이 링크는 현재 종료되었습니다
Vadim Kotov

5

xlarge 화면 및 x..high 밀도를 확인해야합니까? 이것은 선택된 답변에서 변경된 코드입니다.

//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) context .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
단지 몇 가지 코드를 덤프하지만 당신은 무엇을했는지 설명이 도움이 어떻게하지 마십시오
데이비드 Medenjak

2

이 기능을 사용해보십시오 isLayoutSizeAtLeast (int screenSize)

작은 화면을 확인하려면 최소 320x426dp 이상 getResources (). getConfiguration (). isLayoutSizeAtLeast (Configuration.SCREENLAYOUT_SIZE_SMALL);

일반 화면을 확인하려면 최소 320x470dp 이상 getResources (). getConfiguration (). isLayoutSizeAtLeast (Configuration.SCREENLAYOUT_SIZE_NORMAL);

큰 화면을 확인하려면 최소 480x640dp 이상 getResources (). getConfiguration (). isLayoutSizeAtLeast (Configuration.SCREENLAYOUT_SIZE_LARGE);

초대형 화면을 확인하려면 최소 720x960dp 이상 getResources (). getConfiguration (). isLayoutSizeAtLeast (Configuration.SCREENLAYOUT_SIZE_XLARGE);


좋은! 이 방법은 API 레벨 11부터 사용할 수 있습니다!
Enselic

2

2018 년 Kotlin에서 Jeff의 답변이 필요한 경우 다음과 같습니다.

  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

문자열 리소스와 열거 형을 사용 하여이 작업을 수행 할 수 없습니까? SMALL, MEDIUM 또는 LARGE와 같이 화면 크기의 이름을 가진 문자열 리소스를 정의 할 수 있습니다. 그런 다음 문자열 리소스의 값을 사용하여 열거 형 인스턴스를 만들 수 있습니다.

  1. 관심있는 다양한 화면 크기에 대해 코드에서 Enum을 정의하십시오.

    public Enum ScreenSize {
        SMALL,
        MEDIUM,
        LARGE,;
    }
  2. 값이 SMALL, MEDIUM 또는 LARGE 인 문자열 자원 (screensize)을 정의하십시오.

    <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 대의 장치로 테스트했지만 LARGE를 기대할 때 태블릿이 여전히 작게 돌아옵니다. 내 string.xml 파일은 상응하는 <string name = "screensize"> xxxxxx </ string>와 함께 values-h1024dp, values-h700dp 및 values-h200dp 안에 정의되어 있습니다
.

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.