如何在运行时在Android中确定屏幕宽度的dp或dip?

我需要使用dip / dp(在java文件中)编码Android小部件的布局。 在运行时,如果我编码,

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

这将返回像素(px)的屏幕宽度。 要将其转换为dp,我编码为:

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

这似乎并没有回到正确的答案。 我制作了WVGA800的模拟器,其屏幕分辨率为480×800。当运行模拟器并让代码打印像素和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的解决scheme。

为了将来的参考:

 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. 

请参阅configuration类参考

编辑:正如尼克Baicoianu指出,这将返回可用的宽度/高度的屏幕(这应该是在大多数使用有趣的)。 如果你需要实际的显示尺寸坚持最上面的答案。

您缺less160的默认密度值。

  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 

换句话说,如果在纵向模式下devise宽度等于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; 

你的问题是将浮点数转换为int,失去精度。 你也应该乘以这个因素而不是分开。

做这个:

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