Загрузить значение измерения из res/values ​​/dimension.xml из исходного кода

Я хотел бы загрузить значение как есть. У меня два файла dimension.xml, один в /res/values/dimension.xml, а другой в /res/values-sw360dp/dimension.xml.

Из исходного кода я хотел бы сделать что-то вроде

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

Это работает, но значение, которое я получаю, умножается на коэффициент плотности экрана (1,5 для hdpi, 2.0 для xhdpi и т.д.).

Я также пытался сделать

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

Это будет работать в принципе, но я получаю строку, которая заканчивается "dip"...

Ответ 1

В моем dimens.xml у меня есть

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

В коде Если я делаю

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

это вернет 72, который, поскольку состояние docs умножается на плотность текущего телефона (48dp x 1,5 в моем случае)

как указано в docs:

Получить размер для конкретного идентификатора ресурса. Конверсии единиц основаны на текущих DisplayMetrics, связанных с ресурсами.

поэтому, если вы хотите точное значение dp так же, как в xml, просто разделите его с помощью плотности DisplayMetrics

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

dp будет теперь 48

Ответ 2

В классе Resource также есть метод getDimensionPixelSize(), который, как я думаю, будет соответствовать вашим потребностям.

Ответ 3

Context.getResources().getDimension(int id);

Ответ 5

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

Я думаю, что полезно получить значение в соответствии с разрешением, но если вы этого не хотите, дайте это в px.......

Не зависящий от плотности пиксель (dp)

Виртуальный пиксельный блок, который следует использовать при определении компоновки пользовательского интерфейса, чтобы выразить размеры или положение макета независимо от плотности. Независимый от плотности пиксель эквивалентен одному физическому пикселю на экране с разрешением 160 точек на дюйм, который представляет собой базовую плотность, принимаемую системой для экрана средней плотности. Во время выполнения система прозрачно обрабатывает любое масштабирование блоков dp, если необходимо, 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. Вы всегда должны использовать блоки dp при определении пользовательского интерфейса приложения, чтобы обеспечить правильное отображение вашего интерфейса на экранах с различной плотностью.

Я думаю, что полезно изменить значение в соответствии с разрешением, но если вы этого не хотите, дайте это в px.......

ссылайтесь на эту ссылку

в соответствии с этим

дп

Не зависящие от плотности пиксели - абстрактный блок, основанный на физической плотности экрана. Эти единицы относятся к экрану 160 точек на дюйм (точек на дюйм), на котором 1dp примерно равно 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 dpi. Likewise, when on a lower density screen, the number of pixels used for 1dp is scaled down. Отношение dp-to-pixel будет меняться с плотностью экрана, но не обязательно в прямой пропорции. Использование блоков dp ​​(вместо единиц пикселей) - это простое решение для правильного изменения размеров представления в вашем макете для разных плотностей экрана. Другими словами, он обеспечивает согласованность размеров вашего пользовательского интерфейса на разных устройствах в реальном мире.

ПВ

Пиксели - соответствует фактическим пикселям на экране. Эта единица измерения не рекомендуется, поскольку фактическое представление может варьироваться в зависимости от устройства; каждое устройство может иметь различное количество пикселей на дюйм и может иметь больше или меньше общих пикселей, доступных на экране.

Ответ 6

Для тех, кому просто нужно сохранить значение int в ресурсах, вы можете сделать следующее.

integers.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="default_value">100</integer>
</resources> 

код

int defaultValue = getResources().getInteger(R.integer.default_value);

Ответ 7

Вы можете использовать один из ваших методов, например ваш второй, и добавить эти строки к результатам:

int stringLength = getResources().getString(R.dimen.tutorial_cross_marginTop).length();
string stringDimensions = getResources().getString(R.dimen.tutorial_cross_marginTop);
int dimension = Integer.parseInt(stringDimensions.substring(stringLength-3, stringLength-1));

Надеюсь, что это поможет:)