2011-09-22 8 views
12

Per esempio, in un layout specifico ho il seguente XML:Quando deve essere utilizzato il file dimens.xml in Android?

vista
<GridView 
    android:id="@+id/gridView1" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:padding="3dp" 
    android:columnWidth="48dp" 
    android:numColumns="auto_fit" 
    android:verticalSpacing="10dp" 
    android:horizontalSpacing="10dp" 
    android:stretchMode="spacingWidth" /> 

Questa griglia è specifico per questo layout e non credo sarò con qualsiasi altra vista della griglia con proprietà simili. Questo per dire che i valori delle dimensioni nel codice sono specifici per quella vista griglia.

Devo ancora spostarli in un file dimens.xml o va bene a lasciarli proprio così? In tal caso, dovrei inserire valori nel file dimens.xml solo quando tale valore è utilizzato su più layout?

risposta

22

mi calo valori di quota in una risorsa dimens.xml tipicamente per tre motivi:

  1. riutilizzo: ho bisogno di più widget o layout di utilizzare lo stesso valore e voglio solo cambiare una volta durante l'aggiornamento o tweaking attraverso l'applicazione
  2. Densità Differenza: Se ho bisogno la dimensione di essere leggermente più piccolo o più grande da ldpi -> hdpi o piccola -> grandi
  3. lettura a partire dal codice: Quando sto un'istanza vista nel codice e si vuole applicare alcune dimensioni statiche, mettendoli in dimens.xml come "dp" o "dip" permette per ottenere un valore ridimensionato nel codice Java con Resources.getDimensionPixelSize()

HTH!

+0

Informazioni su # 2, come ti distingui nel file 'dimens.xml' (fornisci un esempio se possibile)? Il motivo 3 è molto convincente. –

+0

@Nazgullato più file nelle directory qualificate. Ad esempio, ponendo un 'dimens.xml' in' res/values' per default e un altro in 'res/values-ldpi' che include i pochi che voglio sovrascrivere per dispositivi a bassa densità. – Devunwired

+0

Pensavo fosse disponibile solo per la cartella dei disegni. Grazie per il consiglio. –

2

Il file dimens.xml viene utilizzato per mantenere tutti i valori dei pixel hard-coded in un unico luogo.

Ora, anche se non è possibile utilizzare ripetutamente questi valori al momento, è comunque consigliabile inserirli in dimens.xml per riferimento futuro. Inoltre, a seguito di una serie di paradigma Android programmazione aiuta ad altri sviluppatori di capire il vostro codice più veloce. Questo è molto simile al strings.xml dove abbiamo posto String s alcuni dei quali finiscono per essere utilizzato una sola volta! :)

+2

Non è esattamente la stessa cosa, i file XML di stringhe consentono anche l'internazionalizzazione, quindi ha più senso separarli dal codice. –

+1

Che tipo di commento è? –

+0

Scusate se non mi sono chiarito. Volevo dire, i tuoi commenti non hanno davvero aiutato la domanda del post originale né è del tutto pertinente al mio post. Sono solo onesto! :) –

1

risposta supplementare

elenca @Devunwired 3 motivi per utilizzare dimens.xml. Ecco i dettagli su come farlo.

1. riutilizzo

se si imposta una certa dp o sp valore dimens.xml una volta come questo

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <dimen name="textview_padding">16dp</dimen> 
    <dimen name="large_text_size">30sp</dimen> 
</resources> 

è possibile riutilizzarlo per tutta la vostra applicazione in più posizioni.

<TextView 
    android:padding="@dimen/textview_padding" 
    android:textSize="@dimen/large_text_size" 
    ... /> 

<TextView 
    android:padding="@dimen/textview_padding" 
    android:textSize="@dimen/large_text_size" 
    ... /> 

Poi, quando hai bisogno di fare un cambiamento, avete solo bisogno di farlo in un unico luogo.

Note

  • Questo è fondamentalmente lo stesso effetto utilizzando uno stile o un tema.
  • essere attenti a non dare due diversi punti di vista lo stesso dimen valore se in realtà non dovrebbero essere.Se è necessario apportare modifiche a un gruppo di viste ma non a un altro, sarà necessario tornare a ciascuna di esse individualmente, il che vanifica lo scopo.

2. formato di differenza

  • @Devunwired chiamato questa differenza Densità, ma se si utilizza dp (densità pixel indipendenti), questo prende già cura sono il problema differenza di densità per tutti, ma i casi più lievi. Quindi, a mio parere, le dimensioni dello schermo sono un fattore più importante per l'utilizzo di dimens.xml.

Un 8dp imbottitura potrebbe sembrare grande su un telefono, ma quando l'applicazione viene eseguita su una tavoletta, sembra troppo stretta. È possibile risolvere questo problema creando due (o più) versioni differenti di dimens.xml.

Fare clic con il pulsante destro del mouse sulla cartella res e scegliere Nuovo> Valore file di risorse. Quindi scrivi in ​​dimens e scegli Larghezza schermo più piccola. Scrivi in ​​ per la larghezza (tablet da 7 "). (Ci sono altri modi di scegliere le dimensioni. Vedere le documentation e this answer di più.)

enter image description here

In questo modo sarà un'altra cartella values che verrà utilizzata per i dispositivi più piccoli la cui larghezza dello schermo è 600dp. Nella vista Android i due file dimens.xml hanno questo aspetto.

enter image description here

Ora si possono modificare in modo indipendente.

valori/dimens.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <dimen name="my_default_padding">16dp</dimen> 
</resources> 

valori-sw600dp/dimens.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <dimen name="my_default_padding">64dp</dimen> 
</resources> 

Quando si utilizza il dimen è sufficiente impostare con il nome utilizzato in entrambi i file dimens.xml.

<LinearLayout 
    ... 
    android:padding="@dimen/my_default_padding"> 

</LinearLayout> 

Il sistema sceglierà automaticamente il valore corretto per te in base al dispositivo che l'utente sta utilizzando.

3. Lettura in dal codice

A volte è un dolore di scala a livello di codice tra px e dp (vedi this answer per quanto).

Se si dispone di un dp valore fisso già definito in dimens.xml come questo

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <dimen name="my_dp_value">16dp</dimen> 
</resources> 

Allora si può facilmente ottenere con

int sizeInPixels = getResources().getDimensionPixelSize(R.dimen.my_dp_value); 

e sarà già convertito in pixel per qualsiasi dispositivo densità l'utente ha.

+0

questo è molto utile. conosci un modo per forzare Android Studio a scegliere uno specifico dimens.xml da utilizzare durante l'anteprima del layout? Sto riscontrando problemi nella configurazione di un file per Samsung S7 landscape: ho creato un file di valori sw640dp, ma l'anteprima sta selezionando l'impostazione predefinita. –

+0

@orionelenzil, non so sull'anteprima del layout. Potresti provare a fare una nuova domanda al riguardo. Dirò che 'sw600dp' è un'impostazione più standard di' sw640dp'. Questa è la larghezza più piccola, quindi '600' includerà' 640' e qualsiasi altra dimensione più grande. Inoltre, fino a quando si ottengono le dimensioni corrette quando si esegue l'applicazione nell'emulatore o in un dispositivo, non penso che sia davvero importante se l'anteprima non funziona. – Suragch

+0

grazie @Suragch. Ho pubblicato una nuova domanda [qui] (https://stackoverflow.com/questions/49138505/android-difficulty-working-with-dimens-xml-files). –