안드로이드에서 화면 크기를 픽셀로 얻는 방법


1842

일부 사용자 지정 요소를 만들고 프로그래밍 방식으로 오른쪽 위 모서리 ( n위쪽 가장자리의 m픽셀 및 오른쪽 가장자리의 픽셀)에 배치하려고합니다 . 따라서 화면 너비와 화면 높이를 얻은 다음 위치를 설정해야합니다.

int px = screenWidth - m;
int py = screenHeight - n;

어떻게받을 수 있나요 screenWidthscreenHeight주요 활동에?


px 대신 dp를 사용하십시오. 그것은 다른 장치와 레이아웃을 왜곡하기 때문에 ..
Jawad Zeb

디스플레이 스케일링을 설명하기 위해 getResources (). getDisplayMetrics (). density를 곱하는 것을 잊지 마십시오
jmaculate

이것은 가장 많이 찬성 된 답변이 항상 최고인 것은 아님을 증명합니다 (많은 사람들이 담당자에 대한 답변을 반복합니다). getSize 및 더 이상 사용되지 않는 getWidth / getHeight 콤보 (오류 무시) 대신 Balaji.K를 사용해보십시오 getMetrics. Nik의 답변에 getDisplayMetrics따르면 시스템 / 상태 막대 크기를 고려할 수도 있습니다. 또한 jmaculate와 LoungeKatt가 밀도 를 사용 하여 EXACT 값을 설명했습니다 : DisplayMetrics dm = getResources().getDisplayMetrics(); float fwidth = dm.density * dm.widthPixels;Android v2.2 (API 8) 및 v4.0에서 테스트되었으며 좋은 결과와 오류 / 경고가 없습니다 .
Armfoot

DisplayMetrics displaymetrics = 새로운 DisplayMetrics (); getWindowManager (). getDefaultDisplay (). getMetrics (displaymetrics); int 높이 = displaymetrics.heightPixels; int width = displaymetrics.widthPixels;
Azahar

DisplayMetrics를 얻는 또 다른 방법 : Resources.getSystem().getDisplayMetrics(). 당신은 Context그들을 얻을 필요가 없습니다 .
Täg

답변:


3478

디스플레이 치수를 픽셀 단위로 사용하려면 getSize다음을 사용할 수 있습니다 .

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;

당신이없는 경우를 통해 Activity기본값 Display을 얻을 수 있습니다 WINDOW_SERVICE:

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();

조각에 있고 이것을 완료하려면 Activity.WindowManager (Xamarin.Android) 또는 getActivity (). getWindowManager () (Java)를 사용하십시오.

getSizeAPI 레벨 13에서 도입 되기 전에는 더 이상 사용되지 않는 getWidthgetHeight메소드를 사용할 수 있습니다 .

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();  // deprecated
int height = display.getHeight();  // deprecated

그러나 유스 케이스의 경우 레이아웃의 여백 / 패딩이 더 적합합니다.

다른 방법은 다음과 같습니다. DisplayMetrics

크기, 밀도 및 글꼴 크기 조정과 같은 디스플레이에 대한 일반적인 정보를 설명하는 구조입니다. DisplayMetrics 멤버에 액세스하려면 다음과 같이 개체를 초기화하십시오.

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

다음에 widthPixels대한 정보를 얻는 데 사용할 수 있습니다 .

"디스플레이의 절대 너비 (픽셀)"

예:

Log.d("ApplicationTagName", "Display width in px is " + metrics.widthPixels);

13
getWidth () 또는 getSize ()? API <13 및 API> 13에서 앱을 실행하려면 어떻게해야합니까?
Carol

52
시도 {display.getSize (size); 너비 = size.x; 높이 = size.y; } catch (NoSuchMethodError e) {너비 = display.getWidth (); 높이 = display.getHeight (); }
Arnaud

248
try/catch그런 검사 에 사용하고 싶은지 모르겠 습니까? if (android.os.Build.VERSION.SDK_INT >= 13)예외없이 전혀 사용 하지 않는 것이 어떻습니까? 나는 try/catch정상적인 앱 흐름에서 나쁜 습관으로 생각합니다.
Patrik

2
@ A-Live를 사용하면 앱도 중단됩니다 (그러나 충돌하지는 않습니다). 그럼에도 불구하고 개발자는 새로운 OS 버전을 미리 확인해야하며 이는 문제를 숨길 수도 있습니다. 또한이 인수를 사용하면 try / catch로 모든 코드 줄을 둘러 쌀 수 있어야합니다. 내 의견으로는 이미 언급 한 것처럼 나쁜 습관입니다.
Patrik

11
탐색 표시 줄 및 / 또는 알림 표시 줄을 제외한 화면 크기를 얻으려면 어떻게해야
Android 개발자

374

한 가지 방법은 다음과 같습니다.

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();
int height = display.getHeight();

더 이상 사용되지 않으며 대신 다음 코드를 시도해야합니다. 코드의 처음 두 줄은 목표를 제공합니다 DisplayMetrics. 이 객체가 같은 필드를 포함 heightPixels, widthPixels.

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

int height = metrics.heightPixels;
int width = metrics.widthPixels;

14
장치의 회전에 따라 메트릭 (너비, 높이)이 변경됩니다.
Tony Chan

8
측정 항목은 디스플레이의 크기를 반환하지만 HoneyComb 이상은 시스템 표시 줄로 인해 반환 된 것보다 공간이 적습니다.
Guy

3
@Guy 구현에 따라 다릅니다. 상태 표시 줄을 숨길 수 있습니다. requestWindowFeature (Window.FEATURE_NO_TITLE); getWindow (). setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
Hagai L

79
getContext (). getResources (). getDisplayMetrics (). widthPixels
Nik

최종 float 스케일 = getResources (). getDisplayMetrics (). density; int width = (int) (metrics.widthPixels * scale + 0.5f); -그렇게 할 때 장치 밀도를 고려해야합니다.
버려진 카트

119

귀하의 질문에 대답하지 않을 수도 있지만 View의 차원이 필요하지만 레이아웃이 아직 배치되지 않았을 때 코드가 실행되고 있음을 알면 유용합니다 (이 질문에 왔을 때 직접 찾고있었습니다) (예 :에서 onCreate()) ViewTreeObserver.OnGlobalLayoutListenerwith를 설정 View.getViewTreeObserver().addOnGlobalLayoutListener()하고 뷰의 크기가 필요한 관련 코드를 거기에 넣을 수 있습니다 . 레이아웃이 배치되면 리스너의 콜백이 호출됩니다.


또는 view.post를 작성하십시오
Lukas Hanacek

view.post는 작동하지 않을 수 있습니다. 해결 방법 일뿐입니다.
marsbear

@marsbear View.post()작동이 보장되지 않는 곳은 어디 입니까? 레이아웃 후에 View의 크기를 얻기 위해이 방법을 사용하고 신뢰할 수 없다는 것을 알고 있기 때문에 궁금합니다.
Tony Chan

@Turbo 나는 다음과 같이 말한다 : p 우리는 이전에 그 해결 방법을 사용했으며 신뢰할 수없는 것으로 판명되었습니다. 이 해결 방법은 초기 레이아웃이 초기화와 동일한 UIThread 회전 내에서 수행된다는 가정을 기반으로합니다. 따라서 다음 UI가 post ()를 통해 전환되기 전에 코드가 실행되도록 예약하고 괜찮을 수 있습니다. 특정 상황에서 레이아웃이 훨씬 오래 걸릴 수 있으며 게시 된 코드가 실행될 때 뷰가 여전히 레이아웃되지 않았습니다. 내가 지금하는 일은 onCreate에 ViewTreeObserver를 추가하고 첫 번째 onLayout 후에 제거합니다. 첫 번째 onLayout 동안 물건을 초기화하십시오.
marsbear

@marsbear View당신이 어느 것을 얻는 것이 중요 ViewTreeObserver합니까? 아니면 모두 같은 것을 공유합니까?
Tony Chan

109

(2012 답변, 오래되었을 수 있습니다.) Honeycomb 이전 버전을 지원하려면 API 13 이전 버전과의 호환성을 설정해야합니다.

int measuredWidth = 0;
int measuredHeight = 0;
WindowManager w = getWindowManager();

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
    Point size = new Point();
    w.getDefaultDisplay().getSize(size);
    measuredWidth = size.x;
    measuredHeight = size.y;
} else {
    Display d = w.getDefaultDisplay();
    measuredWidth = d.getWidth();
    measuredHeight = d.getHeight();
}

물론 더 이상 사용되지 않는 메소드는 최신 SDK에서 제거되지만 Android 2.1, 2.2 및 2.3을 사용하는 대부분의 사용자에게 여전히 의존하지만 이것이 우리에게 남아 있습니다.


예, 이것은 2012 년에 다시 시작되었습니다.
digiphd

죄송합니다. 제가 의미하는 바를 명확히하겠습니다.
2015 년

69

가능한 모든 "솔루션"을 시도했지만 Elliott Hughes의 "Dalvik Explorer"앱은 항상 모든 Android 기기 / OS 버전에서 올바른 치수를 표시합니다. https://code.google.com/p/enh/ 에서 찾을 수있는 그의 오픈 소스 프로젝트를 보았습니다.

모든 관련 코드는 다음과 같습니다.

WindowManager w = activity.getWindowManager();
Display d = w.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
d.getMetrics(metrics);
// since SDK_INT = 1;
widthPixels = metrics.widthPixels;
heightPixels = metrics.heightPixels;
try {
    // used when 17 > SDK_INT >= 14; includes window decorations (statusbar bar/menu bar)
    widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);
    heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d);
} catch (Exception ignored) {
}
try {
    // used when SDK_INT >= 17; includes window decorations (statusbar bar/menu bar)
    Point realSize = new Point();
    Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize);
    widthPixels = realSize.x;
    heightPixels = realSize.y;
} catch (Exception ignored) {
}

편집 : 약간 개선 된 버전 (지원되지 않는 OS 버전에서 발생하는 예외는 피하십시오) :

WindowManager w = activity.getWindowManager();
Display d = w.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
d.getMetrics(metrics);
// since SDK_INT = 1;
widthPixels = metrics.widthPixels;
heightPixels = metrics.heightPixels;
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17)
try {
    widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);
    heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d);
} catch (Exception ignored) {
}
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 17)
try {
    Point realSize = new Point();
    Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize);
    widthPixels = realSize.x;
    heightPixels = realSize.y;
} catch (Exception ignored) {
}

9
이것은 창 장식 (상태 표시 줄 / 메뉴 표시 줄)을 고려한 유일한 게시물입니다. 나를 위해 일했다.
Andy Cochrane

5
그러나 비즈니스 로직 화재 예외를 예상해서는 안됩니다. 예외 발생 (발견 된 경우에도)은 성능이 끔찍합니다. 또한 SDK_INT가 13보다 큰 경우 필요한 것보다 많은 작업을 수행하고 있습니다. 대신 Build.VERSION.SDK_INT에 if를 추가해야합니다.
Erik B

3
@Erik B, 동의합니다. 개선 된 버전을 추가했습니다. 여전히 시도 / 캐치에서 문제가 발생하는 경우를 대비하여 "SDK 1부터"부분을 남겼습니다. (안드로이드에서 특히 잘못된 것이 불가능하다고 생각할 때 많은 나쁜 점을 보았으므로 안전하게 유지하고 싶습니다.) . 어쨌든이 계산은 한 번만 수행되어야하기 때문에 너무 많은 오버 헤드가 발생하지 않아야합니다 (예 : 값은 일부 정적 속성에 유지 될 수 있음).
Dragan Marjanović 2016 년

8
이 코드는 프로덕션 앱에서 사용하기 위해 GPL v3에 따라 라이센스가 부여됩니다.
TalkLittle

GPL 및 향후 Android 버전에는 없을 수있는 호출 메소드 반영에 따라 다릅니다. Mhhh
Michel

47

가장 간단한 방법 :

 int screenHeight = getResources().getDisplayMetrics().heightPixels;
 int screenWidth = getResources().getDisplayMetrics().widthPixels; 

46

Android 기기의 상태 표시 줄 높이에 액세스하려면 프로그래밍 방식으로 얻는 것이 좋습니다.

샘플 코드

int resId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resId > 0) {
    result = getResources().getDimensionPixelSize(resId);
}

변수 result는 픽셀의 높이를 제공합니다.

빠른 액세스

여기에 이미지 설명을 입력하십시오

높이에 대한 자세한 내용은 Title bar, Navigation barContent View에, 친절하게 살펴 Android 기기 화면 크기 .


내가 필요한 것! getResources().getDisplayMetrics().heightPixels + result실제 전체 화면 높이를 제공합니다. Dragan Marjanović의 답변도 효과가 있지만 더 짧고 간단한 솔루션을 선호합니다.
Michel

이 접근법은 Android Marshmallow부터 구식입니다. 상태 표시 줄 높이는 기기 또는 Android 버전에서 변경 될 수 있습니다. 더 나은 사용 OnApplyWindowInsetsListener.
하인리히

32

먼저보기 (예 : by ) 를 얻은 다음보기 자체에서 getWidth ()findViewById()사용할 수 있습니다 .


3
이것은 실제로 문서가 지시하는 방법입니다 ...하지만보기를 사용하지 않으면 다소 의미가 없습니다. mglsurfaceview와 같은 다른 것을 사용하고있을 수 있습니다.
gcb

2
부모보기가 디스플레이 크기가 아닐 수 있으므로 더 좋습니다. 그러나 크기를 쿼리하는 뷰가 이미 배치되어있는 시점 (일반적으로 onCreate () 안에 있지 않음)에서 수행해야합니다. onWindowFocusChanged (boolean hasFocus)에서 사용자 정의 콜백을 사용할 수 있습니다.이 뷰는 모든 뷰가 측정 된 후 호출되어 원하는 뷰에 대해 잘못된 치수를받지 않도록합니다.
Dori

27

컨텍스트를 보내고 다른 하나는 높이와 너비를 픽셀 단위로 가져 오는 두 가지 기능이 있습니다.

public static int getWidth(Context mContext){
    int width=0;
    WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    if(Build.VERSION.SDK_INT>12){
        Point size = new Point();
        display.getSize(size);
        width = size.x;
    }
    else{
        width = display.getWidth();  // Deprecated
    }
    return width;
}

public static int getHeight(Context mContext){
    int height=0;
    WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    if(Build.VERSION.SDK_INT>12){
        Point size = new Point();
        display.getSize(size);
        height = size.y;
    }
    else{
        height = display.getHeight();  // Deprecated
    }
    return height;
}

@SuppressLint("NewApi")컴파일하려면 함수 서명 바로 위에 추가해야합니다 .
Adil Malik

API에 대한 별도의 호출보다는 높이와 너비를 한 번에 얻는 것이 더 좋다고 생각합니다. 그렇지 않으면 동기화되지 않을 수 있기 때문입니다. 코드가 실행되는 동안 화면 방향이 변경되면 발생할 수 있습니다.
Sam

17

XML을 사용하여 동적으로 확장하려면 "android : layout_weight"라는 속성이 있습니다.

이 스레드에 대한 synic의 응답에서 수정 된 아래 예제 는 화면의 75 % (무게 = .25)를 차지하는 버튼과 화면의 나머지 25 % (무게 = .75)를 차지하는 텍스트보기를 보여줍니다.

<LinearLayout android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight=".25"
        android:text="somebutton">

    <TextView android:layout_width="fill_parent"
        android:layout_height="Wrap_content"
        android:layout_weight=".75">
</LinearLayout>

17

이것은 작업에 사용하는 코드입니다.

// `activity` is an instance of Activity class.
Display display = activity.getWindowManager().getDefaultDisplay();
Point screen = new Point();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
    display.getSize(screen);
} else {            
    screen.x = display.getWidth();
    screen.y = display.getHeight();
}

충분히 깨끗해 보이지만 더 이상 사용되지 않습니다.


17

이것이 훨씬 더 나은 해결책이 아닙니까? DisplayMetrics 는 API 1부터 필요한 모든 기능을 제공합니다.

public void getScreenInfo(){
    DisplayMetrics metrics = new DisplayMetrics();
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);

    heightPixels = metrics.heightPixels;
    widthPixels = metrics.widthPixels;
    density = metrics.density;
    densityDpi = metrics.densityDpi;
}

getRealMetrics를 사용하여 실제 표시 (상태 표시 줄 또는 소프트웨어 탐색 표시 줄과 같은 화면 장식 포함)를 가져올 수도 있지만 17+에서만 작동합니다.

뭔가 빠졌습니까?


1
화면 제어 (예 : 태블릿 또는 Nexus 기기)를위한 공간을 빼지 않습니다. 또한, 나는 계산이 완료되면 활동의 활성화 여부에 따라, 제 10 "태블릿에 다른 값 (800 대 750)를 얻을하지만 내 목적이 더 잘보다 주셔서 감사합니다..!
스티븐 L

15

프란체스코의 답변에 추가하십시오. 창에서 위치 또는 화면에서 위치를 찾으려면 더 적합한 다른 관찰자는 ViewTreeObserver.OnPreDrawListener ()입니다.

또한 onCreate () 시간에 주로 알려지지 않은 뷰의 다른 속성 (예 : 스크롤 된 위치, 축척 된 위치)을 찾는 데 사용할 수 있습니다.


15

활동에서 다음 코드 사용

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int height = metrics.heightPixels;
int wwidth = metrics.widthPixels;

15

화면의 너비와 높이를 찾으십시오.

width = getWindowManager().getDefaultDisplay().getWidth();
height = getWindowManager().getDefaultDisplay().getHeight();

이를 사용하여 최신 SDK 13 이상을 얻을 수 있습니다.

// New width and height
int version = android.os.Build.VERSION.SDK_INT;
Log.i("", " name == "+ version);
Display display = getWindowManager().getDefaultDisplay();
int width;
if (version >= 13) {
    Point size = new Point();
    display.getSize(size);
    width = size.x;
    Log.i("width", "if =>" +width);
}
else {
    width = display.getWidth();
    Log.i("width", "else =>" +width);
}

15
DisplayMetrics dimension = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dimension);
int w = dimension.widthPixels;
int h = dimension.heightPixels;

12

나는 이것이 속임수임을 알았다.

Rect dim = new Rect();
getWindowVisibleDisplayFrame(dim);

5
쿨하지만 소스 코드 에서이 방법에 대한 무서운 것입니다 : 이 의견
Norbert

12

말할 필요가 없지만에 Activity있지만 View(또는 View범위 에 유형 변수가있는 경우) 사용할 필요는 없습니다 WINDOW_SERVICE. 그런 다음 두 가지 이상의 방법을 사용할 수 있습니다.

먼저:

DisplayMetrics dm = yourView.getContext().getResources().getDisplayMetrics();

둘째:

DisplayMetrics dm = new DisplayMetrics();
yourView.getDisplay().getMetrics(dm);

여기서 호출하는이 모든 방법은 더 이상 사용되지 않습니다.


12
public class AndroidScreenActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        String str_ScreenSize = "The Android Screen is: "
                                   + dm.widthPixels
                                   + " x "
                                   + dm.heightPixels;

        TextView mScreenSize = (TextView) findViewById(R.id.strScreenSize);
        mScreenSize.setText(str_ScreenSize);
    }
}

11

화면 크기를 얻으려면 디스플레이 측정 항목을 사용하십시오.

DisplayMetrics displayMetrics = new DisplayMetrics();
if (context != null) 
      WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
      Display defaultDisplay = windowManager.getDefaultDisplay();
      defaultDisplay.getRealMetrics(displayMetrics);
    }

높이와 너비를 픽셀 단위로 가져옵니다

int width  =displayMetrics.widthPixels;
int height =displayMetrics.heightPixels;

9

실제 픽셀 단위의 디스플레이 크기를 원했기 때문에 이것은 OP에 대한 대답이 아닙니다. "장치 독립적 픽셀"의 치수를 원했고 여기 https://stackoverflow.com/a/17880012/253938 과 여기 https://stackoverflow.com/a/6656774/253938 에서 답변을 모았 습니다. 이것으로 :

    DisplayMetrics displayMetrics = Resources.getSystem().getDisplayMetrics();
    int dpHeight = (int)(displayMetrics.heightPixels / displayMetrics.density + 0.5);
    int dpWidth = (int)(displayMetrics.widthPixels / displayMetrics.density + 0.5);

9

다음을 사용하여 높이 크기를 얻을 수 있습니다 .

getResources().getDisplayMetrics().heightPixels;

상기 의 크기가 사용

getResources().getDisplayMetrics().widthPixels; 

8

try / catch 혼잡함을 피하는 DisplayMetrics (API 1)를 사용하여이 작업을 수행하는 데 사용되지 않는 방법이 있습니다.

 // initialize the DisplayMetrics object
 DisplayMetrics deviceDisplayMetrics = new DisplayMetrics();

 // populate the DisplayMetrics object with the display characteristics
 getWindowManager().getDefaultDisplay().getMetrics(deviceDisplayMetrics);

 // get the width and height
 screenWidth = deviceDisplayMetrics.widthPixels;
 screenHeight = deviceDisplayMetrics.heightPixels;

8

다음과 같이 getSize 코드를 래핑합니다.

@SuppressLint("NewApi")
public static Point getScreenSize(Activity a) {
    Point size = new Point();
    Display d = a.getWindowManager().getDefaultDisplay();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        d.getSize(size);
    } else {
        size.x = d.getWidth();
        size.y = d.getHeight();
    }
    return size;
}

Android 4.0 (API 14)을 실행하는 에뮬레이터에서 충돌이 발생합니다.
jww

6

Swapnil의 답변 덕분에 상태 표시 줄작업 표시 없이 사용 가능한 화면 크기 를 검색하는 사람 :

DisplayMetrics dm = getResources().getDisplayMetrics();
float screen_w = dm.widthPixels;
float screen_h = dm.heightPixels;

int resId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resId > 0) {
    screen_h -= getResources().getDimensionPixelSize(resId);
}

TypedValue typedValue = new TypedValue();
if(getTheme().resolveAttribute(android.R.attr.actionBarSize, typedValue, true)){
    screen_h -= getResources().getDimensionPixelSize(typedValue.resourceId);
}

6

먼저 XML 파일을로드 한 후 다음 코드를 작성하십시오.

setContentView(R.layout.main);      
Display display = getWindowManager().getDefaultDisplay();
final int width = (display.getWidth());
final int height = (display.getHeight());

화면 해상도에 따라 너비와 높이를 표시하십시오.


6

아래 방법을 따르십시오.

public static int getWidthScreen(Context context) {
    return getDisplayMetrics(context).widthPixels;
}

public static int getHeightScreen(Context context) {
    return getDisplayMetrics(context).heightPixels;
}

private static DisplayMetrics getDisplayMetrics(Context context) {
    DisplayMetrics displayMetrics = new DisplayMetrics();
    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    wm.getDefaultDisplay().getMetrics(displayMetrics);
    return displayMetrics;
}

6

코 틀린

fun getScreenHeight(activity: Activity): Int {
    val metrics = DisplayMetrics()
    activity.windowManager.defaultDisplay.getMetrics(metrics)
    return metrics.heightPixels
}

fun getScreenWidth(activity: Activity): Int {
    val metrics = DisplayMetrics()
    activity.windowManager.defaultDisplay.getMetrics(metrics)
    return metrics.widthPixels
}

5

활동의 onCreate에있을 때 레이아웃에 사용 가능한 공간의 정확한 크기를 알아야하는 경우가 있습니다. 몇 가지 생각을 한 후에 나는이 작업을 수행했습니다.

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        startActivityForResult(new Intent(this, Measure.class), 1);
        // Return without setting the layout, that will be done in onActivityResult.
    }

    @Override
    protected void onActivityResult (int requestCode, int resultCode, Intent data) {
        // Probably can never happen, but just in case.
        if (resultCode == RESULT_CANCELED) {
            finish();
            return;
        }
        int width = data.getIntExtra("Width", -1);
        // Width is now set to the precise available width, and a layout can now be created.            ...
    }
}

public final class Measure extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
       // Create a LinearLayout with a MeasureFrameLayout in it.
        // Just putting a subclass of LinearLayout in works fine, but to future proof things, I do it this way.
        LinearLayout linearLayout = new LinearLayout(this);
        LinearLayout.LayoutParams matchParent = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
        MeasureFrameLayout measureFrameLayout = new MeasureFrameLayout(this);
        measureFrameLayout.setLayoutParams(matchParent);
        linearLayout.addView(measureFrameLayout);
        this.addContentView(linearLayout, matchParent);
        // measureFrameLayout will now request this second activity to finish, sending back the width.
    }

    class MeasureFrameLayout extends FrameLayout {
        boolean finished = false;
        public MeasureFrameLayout(Context context) {
            super(context);
        }

        @SuppressLint("DrawAllocation")
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            if (finished) {
                return;
            }
            finished = true;
            // Send the width back as the result.
            Intent data = new Intent().putExtra("Width", MeasureSpec.getSize(widthMeasureSpec));
            Measure.this.setResult(Activity.RESULT_OK, data);
            // Tell this activity to finish, so the result is passed back.
            Measure.this.finish();
        }
    }
}

어떤 이유로 Android 매니페스트에 다른 활동을 추가하지 않으려는 경우 다음과 같이 할 수 있습니다.

public class MainActivity extends Activity {
    static Activity measuringActivity;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        Bundle extras = getIntent().getExtras();
        if (extras == null) {
            extras = new Bundle();
        }
        int width = extras.getInt("Width", -2);
        if (width == -2) {
            // First time in, just start another copy of this activity.
            extras.putInt("Width", -1);
            startActivityForResult(new Intent(this, MainActivity.class).putExtras(extras), 1);
            // Return without setting the layout, that will be done in onActivityResult.
            return;
        }
        if (width == -1) {
            // Second time in, here is where the measurement takes place.
            // Create a LinearLayout with a MeasureFrameLayout in it.
            // Just putting a subclass of LinearLayout in works fine, but to future proof things, I do it this way.
            LinearLayout linearLayout = new LinearLayout(measuringActivity = this);
            LinearLayout.LayoutParams matchParent = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
            MeasureFrameLayout measureFrameLayout = new MeasureFrameLayout(this);
            measureFrameLayout.setLayoutParams(matchParent);
            linearLayout.addView(measureFrameLayout);
            this.addContentView(linearLayout, matchParent);
            // measureFrameLayout will now request this second activity to finish, sending back the width.
        }
    }

    @Override
    protected void onActivityResult (int requestCode, int resultCode, Intent data) {
        // Probably can never happen, but just in case.
        if (resultCode == RESULT_CANCELED) {
            finish();
            return;
        }
        int width = data.getIntExtra("Width", -3);
        // Width is now set to the precise available width, and a layout can now be created. 
        ...
    }

class MeasureFrameLayout extends FrameLayout {
    boolean finished = false;
    public MeasureFrameLayout(Context context) {
        super(context);
    }

    @SuppressLint("DrawAllocation")
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        if (finished) {
            return;
        }
        finished = true;
        // Send the width back as the result.
        Intent data = new Intent().putExtra("Width", MeasureSpec.getSize(widthMeasureSpec));
        MainActivity.measuringActivity.setResult(Activity.RESULT_OK, data);
        // Tell the (second) activity to finish.
        MainActivity.measuringActivity.finish();
    }
}    

분명히 번들의 높이를 다시 전달할 수도 있습니다.
Steve Waring 12

5

WindowManager, Points 또는 Displays의 오버 헤드를 원하지 않는 경우, 높이와 너비가 match_parent로 설정되어 있으면 XML에서 최상위 View 항목의 높이와 너비 속성을 가져올 수 있습니다. 레이아웃이 전체 화면을 차지하는 한 사실입니다.

예를 들어, XML이 다음과 같이 시작되는 경우 :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/entireLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

그런 다음 findViewById(R.id.entireLayout).getWidth()화면 너비 findViewById(R.id.entireLayout).getHeight()를 반환하고 화면 높이를 반환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.