Comment déterminer la largeur de l’écran en termes de dp ou de dip à l’exécution dans Android?

J’ai besoin de coder la disposition des widgets Android en utilisant dip / dp (dans les fichiers Java). A l’exécution si je code,

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

Cela renvoie la largeur de l’écran en pixels (px). Pour convertir cela en dp, j’ai codé:

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

Cela ne semble pas être une réponse correcte. J’ai créé l’émulateur de WVGA800 dont la résolution d’écran est de 480 par 800. Lorsque l’émulateur est exécuté et que le code imprime les valeurs de pixel et de dp, il est passé à 320 dans les deux. Cet émulateur est de 240 dpi et son facteur d’échelle serait 0,75.

Essaye ça

 Display display = getWindowManager().getDefaultDisplay(); DisplayMesortingcs outMesortingcs = new DisplayMesortingcs (); display.getMesortingcs(outMesortingcs); float density = getResources().getDisplayMesortingcs().density; float dpHeight = outMesortingcs.heightPixels / density; float dpWidth = outMesortingcs.widthPixels / density; 

OU

Merci à Tomáš Hubálek

 DisplayMesortingcs displayMesortingcs = context.getResources().getDisplayMesortingcs(); float dpHeight = displayMesortingcs.heightPixels / displayMesortingcs.density; float dpWidth = displayMesortingcs.widthPixels / displayMesortingcs.density; 

Je suis tombé sur cette question de Google, et plus tard j’ai trouvé une solution facile valable pour API> = 13.

Pour des références futures:

 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. 

Voir la référence de la classe de configuration

Edit: Comme l’a noté Nick Baicoianu, cela retourne la largeur / hauteur utilisable de l’écran (ce qui devrait être intéressant dans la plupart des cas). Si vous avez besoin des dimensions d’affichage réelles, restz fidèle à la réponse.

Vous manquez une valeur de densité par défaut de 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 

En d’autres termes, si vous concevez votre mise en page avec une largeur égale à 160dip en mode portrait, ce sera la moitié de l’écran sur tous les périphériques ldpi / mdpi / hdpi (sauf les tablettes, je pense)

Que diriez-vous d’utiliser cela à la place?

 final DisplayMesortingcs displayMesortingcs=getResources().getDisplayMesortingcs(); final float screenWidthInDp=displayMesortingcs.widthPixels/displayMesortingcs.density; final float screenHeightInDp=displayMesortingcs.heightPixels/displayMesortingcs.density; 
 DisplayMesortingcs displayMesortingcs = new DisplayMesortingcs(); getWindowManager().getDefaultDisplay().getMesortingcs(displayMesortingcs); int width_px = Resources.getSystem().getDisplayMesortingcs().widthPixels; int height_px =Resources.getSystem().getDisplayMesortingcs().heightPixels; int pixeldpi = Resources.getSystem().getDisplayMesortingcs().densityDpi; int width_dp = (width_px/pixeldpi)*160; int height_dp = (height_px/pixeldpi)*160; 

Votre problème est de lancer le flotteur dans un int, en perdant en précision. Vous devez également multiplier avec le facteur et ne pas diviser.

Faites ceci:

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