395

値をそのままロードしたいのですが。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」で終わる文字列を取得します...

4

10 に答える 10

920

私のdimens.xmlには

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

コードで私がするなら

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

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

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

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

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

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

dpは48になります

于 2013-04-29T10:27:07.287 に答える
22
Context.getResources().getDimension(int id);
于 2012-06-20T13:47:54.310 に答える
18

このResourceクラスには、ニーズに合うと思うgetDimensionPixelSize()メソッドもあります。

于 2012-06-20T13:48:14.267 に答える
18

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);
于 2017-10-25T03:10:11.183 に答える
15

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

int valueInPixels = getResources().getDimensionPixelOffset(R.dimen.test)
于 2018-02-02T11:16:32.893 に答える
11

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を取得します。

于 2020-01-09T09:09:52.860 に答える
5

xmlファイルに整数を書き込むこともできます。
[this] http://developer.android.com/guide/topics/resources/more-resources.html#Integerを見たことがありますか?使用 。

 context.getResources().getInteger(R.integer.height_pop);
于 2013-11-07T05:23:28.210 に答える
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

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

px

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

于 2012-06-20T13:47:55.200 に答える
2

これは、dpからpx、次にpxからdpへの二重変換を含まないより良い解決策です。

Kotlinで

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)

Javaの場合

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);
于 2021-08-24T14:50:52.840 に答える
1

サイズフォントを動的に変更したいだけの場合は、次のことができます。

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
     */

リソースディメンション値に適切な値を掛けたもの

于 2020-11-10T07:01:13.543 に答える