2012-06-20 14 views
234

Vorrei caricare il valore così com'è. Ho due file dimension.xml, uno in /res/values/dimension.xml e l'altro in /res/values-sw360dp/dimension.xml.Carica il valore della dimensione da res/values ​​/ dimension.xml dal codice sorgente

dal codice sorgente mi piacerebbe fare qualcosa di simile

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

Questo funziona, ma il valore che ottengo è moltiplicato volte 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); 

Questo potrebbe funzionare in linea di principio ma ottengo una stringa che termina in "tuffo" ...

+1

Mi chiedo se è bug in Android come risorse ha metodo 'getDimensionPixelSize (int id)' che afferma esattamente che ritorna in pixel, in modo da 'getDimension (int id)' dovrebbe tornare in dp (unità indipendenti di dipendenza), che sarebbe pronto per l'uso, ad es con View 'setPadding' –

risposta

585

Nel mio dimens.xml ho

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

Nel codice Se faccio

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

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

esattamente come Stato docs:

Recupero di un dimensionale per un particolare ID di risorsa. Le conversioni di unità si basano sulla DisplayMetrics corrente associata alle risorse.

Quindi, se volete esatto valore dp proprio come in XML solo dividere con densità DisplayMetrics

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

dp sarà 48 ora

+1

Penso che la documentazione non sia particolarmente chiara qui. "Le conversioni di unità sono basate sulla corrente DisplayMetrics associata alle risorse." quando tutto quello che vogliono dire è che convertono in pixel. – Trilarion

+0

Se in pratica stai per scartare il moltiplicatore delle metriche di visualizzazione, puoi anche definire la tua dimensione in px. 48px. getDimension (R.dimen.test) restituirà 48. –

17
Context.getResources().getDimension(int id); 
1
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 come da risoluzione ma se non si desidera eseguire questa operazione, darlo in px .......

pixel indipendenti dalla densità (dp)

Un'unità di pixel virtuale che è necessario utilizzare quando si definisce il layout dell'interfaccia utente, per esprimere le dimensioni del layout o la posizione in modo indipendente dalla densità. Il pixel indipendente dalla densità è equivalente a un pixel fisico su uno schermo da 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. È necessario utilizzare sempre unità dp quando si definisce l'interfaccia utente dell'applicazione, per garantire la corretta visualizzazione dell'interfaccia utente su schermi con densità diverse.

penso che sia bene cambiare il valore di cui alla delibera, ma se non si vuole fare questo dare questo px .......

riferiscono questa link

di cui al presente

dp

Pixel dipendenti dalla densità: un'unità astratta basata sulla densità fisica dello schermo. Queste unità sono relative a uno schermo da 160 dpi (punti per pollice), in cui 1 dpi è approssimativamente uguale a 1 pixel. 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-to-pixel cambierà con la densità dello schermo, ma non necessariamente in proporzione diretta. L'uso delle unità dp (invece delle unità px) è una soluzione semplice per rendere le dimensioni della vista nel layout ridimensionate correttamente per diverse densità dello schermo. In altre parole, fornisce coerenza per le dimensioni reali degli elementi dell'interfaccia utente su dispositivi diversi.

px

Pixel - corrispondenti a pixel effettivi sullo schermo. Questa unità di misura non è raccomandata in quanto la rappresentazione effettiva può variare tra i vari dispositivi; ogni dispositivo può avere un numero diverso di pixel per pollice e può avere più o meno pixel totali disponibili sullo schermo.

21

La classe Resource ha anche un metodo getDimensionPixelSize() che penso soddisfi le vostre esigenze.

+21

Questo è sbagliato! la conversione delle metriche avviene anche in 'getDimensionPixelSize()' se puoi riferire i documenti dichiara chiaramente ** Resi ** 'Valore dimensione risorsa moltiplicato per la metrica appropriata e troncato per pixel interi. –

+0

Questo è sbagliato. La conversione delle metriche avviene anche con questo metodo. –

-1

È possibile utilizzare uno dei tuoi metodi, per esempio, il secondo e aggiungere queste righe ai risultati:

int stringLength = getResources().getString(R.dimen.tutorial_cross_marginTop).length(); 
string stringDimensions = getResources().getString(R.dimen.tutorial_cross_marginTop); 
int dimension = Integer.parseInt(stringDimensions.substring(stringLength-3, stringLength-1)); 

Mi auguro che aiuta :)

4

Per coloro che hanno solo bisogno di risparmiare un po int valore delle risorse, è possibile effettuare le seguenti operazioni.

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

Grazie per questo, è stato più di quello che stavo cercando anche se forse non per gli altri, ma questa soluzione fornita in realtà mi ha fornito alcune informazioni su altre aree del mio codice – JamisonMan111

0

È possibile utilizzare getDimensionPixelOffset() invece di getDimension, quindi non c'era bisogno di lanciare a int.

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