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

Héc*_*ena 319 android dpi dimension android-resources

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

从源代码我想做的事情

getResources().getDimension(R.dimen.tutorial_cross_marginTop);
Run Code Online (Sandbox Code Playgroud)

这是有效的,但我获得的值乘以屏幕密度系数(hdpi为1.5,xhdpi为2.0等).

我也试过

getResources().getString(R.dimen.tutorial_cross_marginTop);
Run Code Online (Sandbox Code Playgroud)

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

And*_*cko 768

在我的dimens.xml中,我有

<dimen name="test">48dp</dimen>
Run Code Online (Sandbox Code Playgroud)

在代码中如果我这样做

int valueInPixels = (int) getResources().getDimension(R.dimen.test)
Run Code Online (Sandbox Code Playgroud)

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

正如文档所述:

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

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

int dp = (int) (getResources().getDimension(R.dimen.test) / getResources().getDisplayMetrics().density)
Run Code Online (Sandbox Code Playgroud)

dp现在是48

  • 我认为文档在这里特别不清楚。“单位转换基于与资源关联的当前DisplayMetrics。” 他们只想说要转换为像素 (2认同)

Jug*_*aut 19

Context.getResources().getDimension(int id);
Run Code Online (Sandbox Code Playgroud)


Ovi*_*tcu 19

Resource班也有一个方法getDimensionPixelSize() ,我认为会满足您的需求.

  • 这是错的!度量转换也发生在`getDimensionPixelSize()`中,如果你可以引用文档明确说明**返回**`资源维度值乘以适当的度量并截断为整数像素. (22认同)

Sur*_*gch 14

对于那些只需要int在资源中保存一些价值的人,您可以执行以下操作.

integers.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="default_value">100</integer>
</resources> 
Run Code Online (Sandbox Code Playgroud)

int defaultValue = getResources().getInteger(R.integer.default_value);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你,更多的是我正在寻找的东西,即使可能不是为了其他人,但提供的这个解决方案实际上让我对我的代码的其他方面有所了解 (2认同)

Nic*_*ico 10

这是一个更好的解决方案,不涉及从 dp 到 px 再从 px 到 dp 的双重转换:

在科特林中

fun Resources.getRawDimensionInDp(@DimenRes dimenResId: Int): Float {
    val value = TypedValue()
    getValue(dimenResId, value, true)
    return TypedValue.complexToFloat(value.data)
}
// Usage: 
resources.getRawDimensionInDp(R.dimen.my_dimen_id)
Run Code Online (Sandbox Code Playgroud)

爪哇语

public class ResourcesUtil {
    static Float getRawDimensionInDp(Resources resources, @DimenRes int dimenResId) {
        TypedValue value = new TypedValue();
        resources.getValue(dimenResId, value, true);
        return TypedValue.complexToFloat(value.data);
    }
}

// Usage: 
ResourcesUtil.getRawDimensionInDp(resources, R.dimen.my_dimen_id);
Run Code Online (Sandbox Code Playgroud)


Jon*_*ght 9

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

int valueInPixels = getResources().getDimensionPixelOffset(R.dimen.test)
Run Code Online (Sandbox Code Playgroud)


Gib*_*olt 9

使用 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
Run Code Online (Sandbox Code Playgroud)

如果你想在没有上下文的情况下处理它,你可以使用Resources.getSystem()

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

val Int.px get() = (this * Resources.getSystem().displayMetrics.density).toInt()
Run Code Online (Sandbox Code Playgroud)

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


And*_*Lad 5

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

 context.getResources().getInteger(R.integer.height_pop);
Run Code Online (Sandbox Code Playgroud)