390 votes

Charger la valeur de la dimension depuis res/values/dimension.xml à partir du code source

Je voudrais charger la valeur telle qu'elle est. J'ai deux dimension.xml l'un dans /res/values/dimension.xml et l'autre dans /res/values-sw360dp/dimension.xml .

A partir du code source, je voudrais faire quelque chose comme

getResources().getDimension(R.dimen.tutorial_cross_marginTop);

Cela fonctionne mais la valeur que j'obtiens est multipliée par le facteur de densité de l'écran (1,5 pour hdpi, 2,0 pour xhdpi, etc.).

J'ai aussi essayé de faire

getResources().getString(R.dimen.tutorial_cross_marginTop);

Cela devrait fonctionner en principe mais j'obtiens une chaîne qui se termine par "dip"...

1 votes

Je me demande s'il s'agit d'un bug dans Android, car les ressources ont une méthode. getDimensionPixelSize(int id) qui indique exactement qu'il revient en Pixel, donc getDimension(int id) devrait revenir en dp (unités indépendantes de dépendance), qui seraient prêtes à être utilisées, par exemple avec View setPadding

910voto

AndroidGecko Points 2216

Dans mon dimens.xml, j'ai

<dimen name="test">48dp</dimen>

Dans le code Si je fais

int valueInPixels = (int) getResources().getDimension(R.dimen.test)

cela renverra 72 qui, comme l'indique la documentation, est multiplié par la densité du téléphone actuel (48dp x 1,5 dans mon cas).

exactement comme indiqué dans la documentation :

Récupérer une dimension pour un ID de ressource particulier. Les conversions d'unités sont basées sur les DisplayMetrics actuelles associées aux ressources.

donc si vous voulez la valeur exacte de dp comme dans le xml il suffit de la diviser avec la densité DisplayMetrics

int dp = (int) (getResources().getDimension(R.dimen.test) / getResources().getDisplayMetrics().density);

dp aura 48 ans maintenant

4 votes

Je pense que la documentation est particulièrement peu claire ici. "Les conversions d'unités sont basées sur les DisplayMetrics actuelles associées aux ressources." alors que tout ce qu'ils veulent dire est qu'ils convertissent en pixels.

0 votes

Si vous allez essentiellement écarter le multiplicateur de la métrique d'affichage, vous pouvez tout aussi bien définir votre dimension en px. <dimen name="test">48px</dimen>. getDimension(R.dimen.test) retournera 48.

0 votes

Pas de travail pour moi : stackoverflow.com/questions/55972518/

22voto

Jug6ernaut Points 2751
Context.getResources().getDimension(int id);

18voto

Ovidiu Latcu Points 20783

Le site Resource a également une méthode getDimensionPixelSize() qui, je pense, répondra à vos besoins.

25 votes

C'est faux ! La conversion des métriques se produit également dans les cas suivants getDimensionPixelSize() Si vous pouvez vous référer aux documents, il est clairement indiqué que Renvoie à Resource dimension value multiplied by the appropriate metric and truncated to integer pixels.

0 votes

C'est faux. La conversion des métriques se produit également avec cette méthode.

5voto

ohm Points 41

Vous pouvez aussi écrire un nombre entier dans un fichier xml
Avez-vous vu [ceci] ? http://developer.Android.com/guide/topics/resources/more-resources.html#Integer ? utiliser comme .

 context.getResources().getInteger(R.integer.height_pop);

2voto

Dheeresh Singh Points 9889
    This works but the value I get is multiplied times the screen density factor
  (1.5 for hdpi, 2.0 for xhdpi, etc).

Je pense qu'il est bon d'obtenir la valeur selon la résolution mais si vous ne voulez pas le faire, donnez-la en px........

Pixel indépendant de la densité (dp)

Unité virtuelle de pixels à utiliser lors de la définition de la mise en page de l'interface utilisateur, pour exprimer les dimensions ou la position de la mise en page d'une manière indépendante de la densité. Le pixel indépendant de la densité équivaut à un pixel physique sur un écran de 160 ppp, qui est la densité de base supposée par le système pour un écran de densité "moyenne". Au moment de l'exécution, le système gère de manière transparente toute mise à l'échelle des unités dp, si nécessaire, based on the actual density of the screen in use. The conversion of dp units to screen pixels is simple: px = dp * (dpi / 160). For example, on a 240 dpi screen, 1 dp equals 1.5 physical pixels. Vous devez toujours utiliser les unités dp lorsque vous définissez l'interface utilisateur de votre application, afin de garantir un affichage correct de votre interface utilisateur sur des écrans de différentes densités.

Je pense qu'il est bon de changer la valeur en fonction de la résolution mais si vous ne voulez pas le faire, donnez le en px........

se référer à ce enlace

selon ce qui suit

dp

Pixels indépendants de la densité - Une unité abstraite qui est basée sur la densité physique de l'écran. Ces unités sont relatives à un écran de 160 dpi (dots per inch), sur lequel 1dp est à peu près égal à 1px. When running on a higher density screen, the number of pixels used to draw 1dp is scaled up by a factor appropriate for the screen's dpi. Likewise, when on a lower density screen, the number of pixels used for 1dp is scaled down. Le rapport dp/pixel change en fonction de la densité de l'écran, mais pas nécessairement de façon directement proportionnelle. L'utilisation d'unités dp (au lieu d'unités px) est une solution simple pour que les dimensions d'affichage de votre mise en page soient correctement redimensionnées pour différentes densités d'écran. En d'autres termes, elle assure la cohérence des tailles réelles de vos éléments d'interface utilisateur sur différents appareils.

px

Pixels - Correspond à des pixels réels sur l'écran. Cette unité de mesure n'est pas recommandée car la représentation réelle peut varier d'un appareil à l'autre ; chaque appareil peut avoir un nombre différent de pixels par pouce et peut avoir plus ou moins de pixels totaux disponibles sur l'écran.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X