从源代码中加载res / values / dimension.xml中的维度值

时间:2012-06-20 13:44:56

标签: android android-resources dpi dimension

我想按原样加载值。 我有两个dimension.xml个文件,一个在/res/values/dimension.xml,另一个在/res/values-sw360dp/dimension.xml

从源代码我想做类似

的事情
getResources().getDimension(R.dimen.tutorial_cross_marginTop);

这样可行,但是我获得的值乘以屏幕密度系数(hdpi为1.5,xhdpi为2.0等)。

我也试过

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

原则上这可行,但我得到一个以“dip”结尾的字符串......

9 个答案:

答案 0 :(得分:722)

在我的dimens.xml中,我有

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

在代码中如果我这样做

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

这将返回72,当文档状态乘以当前手机的密度(在我的情况下为48dp x 1.5)

与docs完全相同:

  

检索特定资源ID的维度。单位转换   基于与资源相关联的当前DisplayMetrics。

所以,如果您想要精确的dp值,就像在xml中一样,只需将其除以DisplayMetrics密度

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

dp现在将是48

答案 1 :(得分:19)

Resource课程还有getDimensionPixelSize()方法,我认为该方法符合您的需求。

答案 2 :(得分:18)

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

答案 3 :(得分:12)

对于那些只需要在资源中保存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);

答案 4 :(得分:7)

您可以使用 getDimensionPixelOffset()而不是getDimension,因此您不必转换为int。

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

答案 5 :(得分:5)

使用Kotlin扩展程序

您可以添加扩展名以简化此过程。它使您可以调用context.dp(R.dimen. tutorial_cross_marginTop)来获取Float值

fun Context.px(@DimenRes dimen: Int): Int = resources.getDimension(dimen).toInt()

fun Context.dp(@DimenRes dimen: Int): Float = px(dimen) / resources.displayMetrics.density

如果要在没有上下文的情况下进行处理,则可以使用Resources.getSystem()

val Int.dp get() = this / Resources.getSystem().displayMetrics.density // Float

val Int.px get() = (this * Resources.getSystem().displayMetrics.density).toInt()

例如,在xhdpi设备上,使用24.dp获得12.0或12.px获得24

答案 6 :(得分:3)

你也可以在xml文件中写整数。
 你见过这个吗]    http://developer.android.com/guide/topics/resources/more-resources.html#Integer?     用作。

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

答案 7 :(得分:1)

    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)

在定义UI布局时应使用的虚拟像素单元,以与密度无关的方式表达布局尺寸或位置。 与密度无关的像素相当于160 dpi屏幕上的一个物理像素,这是系统为“中等”密度屏幕假定的基线密度。在运行时,系统会根据需要透明地处理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.在定义应用程序的UI时,应始终使用dp单位,以确保在不同密度的屏幕上正确显示UI。

我认为按照分辨率更改值是好的,但是如果你不想这样做,请在px中给出这个.......

参考此link

按照这个

DP

与密度无关的像素 - 基于屏幕物理密度的抽象单位。这些单位相对于160 dpi(每英寸点数)的屏幕,其中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's dpi. Likewise, when on a lower density screen, the number of pixels used for 1dp is scaled down. dp与像素的比率将随着屏幕密度而变化,但不一定是正比例。使用dp单位(而不是px单位)是一种简单的解决方案,可以使布局中的视图尺寸适当调整以适应不同的屏幕密度。换句话说,它为不同设备的UI元素的实际大小提供了一致性。

PX

像素 - 对应于屏幕上的实际像素。建议不要使用此计量单位,因为实际表示可能因设备而异;每个设备每英寸可能有不同数量的像素,并且屏幕上可用的总像素数可能更多或更少。

答案 8 :(得分:0)

如果您只想动态更改大小字体,则可以:

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, resources.getDimension(R.dimen.tutorial_cross_marginTop))

作为@achie的答案,您可以像这样从dimens.xml获取dp:

val dpValue = (resources.getDimension(R.dimen.tutorial_cross_marginTop)/ resources.displayMetrics.density).toInt()

或得到这样的sp

val spValue = (resources.getDimension(R.dimen.font_size)/ resources.displayMetrics.scaledDensity).toInt()

关于Resources.java#{getDimension}

    /**
     * Retrieve a dimensional for a particular resource ID.  Unit 
     * conversions are based on the current {@link DisplayMetrics} associated
     * with the resources.
     * 
     * @param id The desired resource identifier, as generated by the aapt
     *           tool. This integer encodes the package, type, and resource
     *           entry. The value 0 is an invalid identifier.
     * 
     * @return Resource dimension value multiplied by the appropriate 
     * metric.
     * 
     * @throws NotFoundException Throws NotFoundException if the given ID does not exist.
     *
     * @see #getDimensionPixelOffset
     * @see #getDimensionPixelSize
     */

资源维度值乘以相应的