Je fais:
button.setLayoutParams(new GridView.LayoutParams(65, 65));
Selon la documentation, les unités de largeur et de hauteur (les deux 65 dans ce qui précède) sont des "pixels". Comment forcer ceci à être des pixels indépendants du périphérique, ou "dp"?
Vous devrez le convertir de dps en pixels à l'aide du facteur d'échelle d'affichage.
final float scale = getContext().getResources().getDisplayMetrics().density;
int pixels = (int) (dps * scale + 0.5f);
Je sais que c’est une vieille question, mais j’ai trouvé un moyen beaucoup plus ordonné de procéder à cette conversion.
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65, getResources().getDisplayMetrics());
manière la plus simple (et même fonctionne à partir de api 1) qui a testé est:
getResources().getDimensionPixelSize(R.dimen.example_dimen);
À partir de documentations:
Récupérer une dimension pour un ID de ressource particulier à utiliser comme taille en pixels bruts. Identique à getDimension (int), sauf que la valeur renvoyée est convertie en pixels entiers et utilisée comme taille. Une conversion de taille implique d'arrondir la valeur de base et de s'assurer qu'une valeur de base non nulle a une taille d'au moins un pixel.
Oui, arrondir la valeur, mais ce n'est pas très grave (juste dans les valeurs impaires sur les périphériques hdpi et ldpi, il faut ajouter une petite valeur lorsque ldpi n'est pas très courant). J'ai testé dans un périphérique xxhdpi qui convertit 4dp en 16 (pixels) vrai.
En regardant vos besoins, il existe une autre solution. Il semble que vous connaissiez les dimensions dans dp au moment de la compilation, vous pouvez donc ajouter une entrée dimen dans les ressources. Ensuite, vous pouvez interroger l'entrée dimen et celle-ci sera automatiquement convertie en pixels dans cet appel:
final float inPixels= mActivity.getResources().getDimension(R.dimen.dimen_entry_in_dp);
Et votre dimens.xml aura:
<dimen name="dimen_entry_in_dp">72dp</dimen>
En prolongeant cette idée, vous pouvez simplement stocker la valeur de 1dp ou 1sp en tant qu'entrée dimen, puis interroger la valeur et l'utiliser en tant que multiplicateur. En utilisant cette approche, vous isolerez le code des éléments mathématiques et vous ferez appel à la bibliothèque pour effectuer les calculs.