Android에서 런타임에 dp 또는 dip로 화면 너비를 결정하는 방법은 무엇입니까? 코딩하면 런타임에

dip / dp (Java 파일)를 사용하여 안드로이드 위젯의 레이아웃을 코딩해야합니다. 내가 코딩하면 런타임에

int pixel=this.getWindowManager().getDefaultDisplay().getWidth();

화면 너비를 픽셀 단위로 반환합니다 (px). 이것을 dp로 변환하려면 코딩했습니다.

int dp =pixel/(int)getResources().getDisplayMetrics().density ;

정답을 반환하지 않는 것 같습니다. 화면 해상도가 480 x 800 인 WVGA800의 에뮬레이터를 만들었습니다. 에뮬레이터를 실행하고 코드가 픽셀과 dp의 값을 인쇄하게하면 둘 다 320이되었습니다. 이 에뮬레이터는 240dpi이며 배율은 0.75입니다.



답변

이 시도

Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics ();
display.getMetrics(outMetrics);

float density  = getResources().getDisplayMetrics().density;
float dpHeight = outMetrics.heightPixels / density;
float dpWidth  = outMetrics.widthPixels / density;

또는

감사합니다 @ Tomáš Hubálek

DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
float dpHeight = displayMetrics.heightPixels / displayMetrics.density;
float dpWidth = displayMetrics.widthPixels / displayMetrics.density;

답변

Google 에서이 질문을 우연히 발견 한 후 나중에 API> = 13에 유효한 쉬운 솔루션을 찾았습니다.

향후 참조를 위해 :

Configuration configuration = yourActivity.getResources().getConfiguration();
int screenWidthDp = configuration.screenWidthDp; //The current width of the available screen space, in dp units, corresponding to screen width resource qualifier.
int smallestScreenWidthDp = configuration.smallestScreenWidthDp; //The smallest screen size an application will see in normal operation, corresponding to smallest screen width resource qualifier.

참조 구성 클래스 참조

편집 : Nick Baicoianu가 지적했듯이 화면 의 사용 가능한 너비 / 높이를 반환합니다 (대부분의 경우 흥미로운 것이어야 함). 실제 디스플레이 크기 가 필요한 경우 상단 답변에 충실하십시오.


답변

기본 밀도 값 160이 누락되었습니다.

    2 px = 3 dip if dpi == 80(ldpi), 320x240 screen
    1 px = 1 dip if dpi == 160(mdpi), 480x320 screen
    3 px = 2 dip if dpi == 240(hdpi), 840x480 screen

즉, 세로 모드에서 너비가 160dip 인 레이아웃을 디자인하면 모든 ldpi / mdpi / hdpi 장치에서 화면의 절반이됩니다 (태블릿 제외).


답변

대신 이것을 사용하는 것은 어떻습니까?

final DisplayMetrics displayMetrics=getResources().getDisplayMetrics();
final float screenWidthInDp=displayMetrics.widthPixels/displayMetrics.density;
final float screenHeightInDp=displayMetrics.heightPixels/displayMetrics.density;

답변

DisplayMetrics displayMetrics = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);

int width_px = Resources.getSystem().getDisplayMetrics().widthPixels;

int height_px =Resources.getSystem().getDisplayMetrics().heightPixels;

int pixeldpi = Resources.getSystem().getDisplayMetrics().densityDpi;


int width_dp = (width_px/pixeldpi)*160;
int height_dp = (height_px/pixeldpi)*160;

답변

kotlin의 답변 :

  context?.let {
        val displayMetrics = it.resources.displayMetrics
        val dpHeight = displayMetrics.heightPixels / displayMetrics.density
        val dpWidth = displayMetrics.widthPixels / displayMetrics.density
    }

답변

Kotlin을 위해 단순화 :

val widthDp = resources.displayMetrics.run { widthPixels / density }
val heightDp = resources.displayMetrics.run { heightPixels / density }