ソースコードからres / values / dimension.xmlからディメンション値を読み込む


337

そのまま値を読み込みたいのですが。2つのdimension.xmlファイルがあります。1つは/res/values/dimension.xmlに、もう1つはにあり/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」で終わる文字列を取得します...


1
リソースにはgetDimensionPixelSize(int id)Pixelで返されると正確に記述されているメソッドがあるため、Androidのバグなのかどうか疑問に思いgetDimension(int id)ます。たとえば、ViewsetPadding
Paul Verest

回答:


811

私のdimens.xmlには

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

コードでは

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

これは72を返します。これは、ドキュメントの状態に現在の電話の密度(私の場合は48 dp x 1.5)を掛けたものです。

ドキュメントの状態とまったく同じ:

特定のリソースIDの次元を取得します。単位変換は、リソースに関連付けられている現在のDisplayMetricsに基づいています。

したがって、xmlと同じように正確なdp値が必要な場合は、DisplayMetrics密度で除算します。

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

dpは48になります


3
ここでは特にドキュメントが不明確だと思います。「単位変換は、リソースに関連付けられている現在のDisplayMetricsに基づいています。」彼らが言いたいのは、ピクセルに変換することだけです。
Trilarion

基本的に表示指標の乗数を破棄する場合は、pxでディメンションを定義することもできます。<dimen name = "test"> 48px </ dimen>。getDimension(R.dimen.test)を返します48
マイケル・ピーターソン


@Trilarionただし、ピクセルに変換するだけではありません。彼らはdpそれを取得するために使用されるリソースオブジェクトのスケールに関連してスケーリングされたピクセル値を与えると言っています。リソースを取得するためのさまざまな方法に入ると、これはより適切になります。簡単にするために、画面の大きさに対するものと考えることができます。またsp、システムのテキストサイズに対する、またはピクセル、およびpx、または直接のピクセルもあります。それぞれが異なり、目的も異なります。
放棄されたカート


17

ResourceクラスはメソッドがあるgetDimensionPixelSize()私はあなたのニーズに合うと思います。


24
これは間違っています!メトリックの変換getDimensionPixelSize()は、ドキュメントに明確に記載されているドキュメントを参照できる場合に も発生します。戻り値 Resource dimension value multiplied by the appropriate metric and truncated to integer pixels.
Muhammad Babar

これは間違っています。メトリックの変換は、この方法でも行われます。
マイケルピーターソン

14

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);

2
これをありがとう、他のものではないかもしれませんが、私が探していたものの多くでしたが、このソリューションは実際に私のコードの他の領域への洞察を提供しました
JamisonMan111 2017年

11

getDimensionの代わりにgetDimensionPixelOffset()を使用できるため、intにキャストする必要はありませんでした。

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


2
    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画面上の1つの物理ピクセルに相当します。これは、「中」の密度の画面用にシステムが想定するベースライン密度です。実行時に、システムは必要に応じて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でこれを指定してください。

このリンクを参照

これに従って

dp

密度非依存ピクセル-画面の物理密度に基づく抽象的な単位。これらの単位は、1 dpiが1ピクセルにほぼ等しい160 dpi(1インチあたりのドット数)画面を基準にしています。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とピクセルの比率は画面密度によって変化しますが、必ずしも正比例しているわけではありません。(px単位の代わりに)dp単位を使用することは、レイアウトのビューの寸法をさまざまな画面密度に合わせて適切にサイズ変更する簡単なソリューションです。つまり、さまざまなデバイスでのUI要素の実際のサイズに一貫性を提供します。

px

ピクセル-画面上の実際のピクセルに対応します。実際の表現はデバイスによって異なるため、この測定単位はお勧めできません。デバイスごとに1インチあたりのピクセル数が異なり、画面上で利用可能な総ピクセル数が増減する場合があります。


2

Kotlin拡張機能を使用する

このプロセスを簡略化する拡張機能を追加できます。context.dp(R.dimen. tutorial_cross_marginTop)フロート値を取得するために呼び出すだけです

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.px24を取得するために使用します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.