Carica il valore della dimensione da res / valori / dimension.xml dal codice sorgente


337

Vorrei caricare il valore così com'è. Ho due dimension.xmlfile, uno dentro /res/values/dimension.xmle l'altro dentro /res/values-sw360dp/dimension.xml.

Dal codice sorgente mi piacerebbe fare qualcosa del genere

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

Funziona ma il valore che ottengo viene moltiplicato per il fattore di densità dello schermo (1,5 per hdpi, 2,0 per xhdpi, ecc.).

Ho anche provato a fare

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

Funzionerebbe in linea di principio ma ottengo una stringa che termina in "dip" ...


1
Mi chiedo se sia un bug in Android poiché Risorse ha un metodo getDimensionPixelSize(int id)che afferma esattamente che ritorna in Pixel, quindi getDimension(int id)dovrebbe tornare in dp (unità indipendenti dalla dipendenza), che sarebbe pronto per l'uso, ad esempio con ViewsetPadding
Paul Verest,

Risposte:


812

Nel mio dimens.xml ho

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

Nel codice Se lo faccio

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

questo restituirà 72 che come stato dei documenti viene moltiplicato per la densità del telefono corrente (48dp x 1,5 nel mio caso)

esattamente come dichiarano i documenti:

Recupera una dimensione per un determinato ID risorsa. Le conversioni di unità si basano sulle attuali DisplayMetrics associate alle risorse.

quindi se vuoi il valore esatto di dp proprio come in xml, basta dividerlo con la densità DisplayMetrics

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

dp sarà 48 ora


3
Penso che la documentazione non sia particolarmente chiara qui. "Le conversioni di unità si basano sugli attuali DisplayMetrics associati alle risorse." quando tutto quello che vogliono dire è che si convertono in pixel.
Trilarion,

Se essenzialmente stai per scartare il moltiplicatore delle metriche di visualizzazione, puoi anche definire la tua dimensione in px. <dimen name = "test"> 48px </dimen>. getDimension (R.dimen.test) restituirà 48.
Michael Peterson,


@Trilarion Tuttavia, non si limitano a convertire semplicemente in pixel. Stanno dicendo che dpfornirà il valore di pixel in scala relativo alla scala dell'oggetto risorsa usato per recuperarlo. Una volta entrati in vari modi per ottenere risorse, questo sarà più rilevante. Per semplicità, puoi pensarlo come relativo alla scala dello schermo. Sono inoltre presenti sppixel o relativi alla dimensione del testo del sistema e pxdirettamente pixel. Ognuno è diverso e ha uno scopo diverso.
Carrello abbandonato


18

La Resourceclasse ha anche un metodo getDimensionPixelSize () che penso possa soddisfare le tue esigenze.


24
Questo è sbagliato! la conversione delle metriche si verifica anche getDimensionPixelSize()se è possibile fare riferimento ai documenti che indica chiaramente Returns Resource dimension value multiplied by the appropriate metric and truncated to integer pixels.
Muhammad Babar

Questo è sbagliato. La conversione delle metriche avviene anche usando questo metodo.
Michael Peterson,

14

Per coloro che hanno solo bisogno di risparmiare un po 'di intvalore nelle risorse, puoi fare quanto segue.

integers.xml

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

Codice

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

2
Grazie per questo, era più di quello che stavo cercando, anche se forse non per gli altri, ma questa soluzione mi ha effettivamente fornito alcune informazioni su altre aree del mio codice
JamisonMan111

11

È possibile utilizzare getDimensionPixelOffset () anziché getDimension, quindi non è stato necessario eseguire il cast in 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).

Penso che sia buono per ottenere il valore secondo la risoluzione, ma se non vuoi farlo, dai questo in px .......

Pixel indipendente dalla densità (dp)

Un'unità pixel virtuale da utilizzare durante la definizione del layout dell'interfaccia utente, per esprimere le dimensioni o la posizione del layout in modo indipendente dalla densità. Il pixel indipendente dalla densità equivale a un pixel fisico su uno schermo a 160 dpi, che è la densità di base assunta dal sistema per uno schermo a densità "media". In fase di runtime, il sistema gestisce in modo trasparente qualsiasi ridimensionamento delle unità dp, se necessario, 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.è sempre necessario utilizzare le unità dp durante la definizione dell'interfaccia utente dell'applicazione, per garantire la corretta visualizzazione dell'interfaccia utente su schermi con densità diverse.

Penso che sia buono cambiare il valore secondo la risoluzione, ma se non vuoi farlo, dai questo in px .......

fai riferimento a questo link

secondo questo

dp

Pixel indipendenti dalla densità - Un'unità astratta basata sulla densità fisica dello schermo. Queste unità sono relative ad uno schermo di 160 dpi (punti per pollice), su cui 1dp è approssimativamente uguale a 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.Il rapporto tra dp-pixel cambierà con la densità dello schermo, ma non necessariamente in proporzione diretta. L'uso di unità dp (anziché unità px) è una soluzione semplice per ridimensionare correttamente le dimensioni della vista nel layout per diverse densità dello schermo. In altre parole, fornisce coerenza per le dimensioni del mondo reale degli elementi dell'interfaccia utente su dispositivi diversi.

px

Pixel: corrisponde ai pixel effettivi sullo schermo. Questa unità di misura non è consigliata perché la rappresentazione effettiva può variare a seconda del dispositivo; ogni dispositivo può avere un diverso numero di pixel per pollice e può avere più o meno pixel totali disponibili sullo schermo.


2

Usa un'estensione Kotlin

È possibile aggiungere un'estensione per semplificare questo processo. Ti consente di chiamare context.dp(R.dimen. tutorial_cross_marginTop)per ottenere il valore Float

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

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

Se vuoi gestirlo senza contesto, puoi usare Resources.getSystem():

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

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

Ad esempio, su un dispositivo xhdpi, utilizzare 24.dpper ottenere 12.0 o 12.pxper ottenere 24

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.