2011-09-22 11 views
12

Na przykład, w konkretnym układzie mam następujące XML:Kiedy powinien zostać użyty plik dimens.xml w systemie Android?

widok
<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" /> 

Siatka ta jest specyficzna dla tego układu i nie sądzę, będę używać żadnych innych widoków siatka o podobnych właściwościach. To znaczy, że wartości wymiarów w kodzie są specyficzne dla tego widoku siatki.

Czy nadal należy przenosić je do pliku dimens.xml, czy po prostu można je tak zostawić? Jeśli tak, czy należy umieszczać wartości w pliku dimens.xml tylko wtedy, gdy ta wartość jest używana w wielu układach?

Odpowiedz

22

wpadnę wartości wymiarów do dimens.xml zasobu zazwyczaj z trzech powodów:

  1. Reuse: Muszę wielu widgetów lub układy używać tej samej wartości i chcę tylko, aby zmienić go kiedyś podczas aktualizacji lub szczypanie Różnica gęstości: jeśli potrzebuję, aby wymiar był trochę mniejszy lub większy od ldpi -> hdpi lub mały -> duży
  2. Odczytywanie kodu: Kiedy tworzę widok w kodzie i chcę zastosuj pewne wymiary statyczne, umieszczając je w postaci dimens.xml, ponieważ "dp" lub "dip" pozwala mnie, aby uzyskać wartość skalowaną w kodzie Java z Resources.getDimensionPixelSize()

HTH!

+0

O # 2, jak rozróżniasz to w pliku 'dimens.xml' (podaj przykład, jeśli to możliwe)? Powód 3 jest bardzo przekonujący. –

+0

@Nazgulled wiele plików w kwalifikowanych katalogach. Na przykład umieszczenie 'dimens.xml' w' res/values' dla wartości domyślnych i innego w 'res/values-ldpi', które obejmuje kilka, które chcę przesłonić dla urządzeń o niskiej gęstości. – Devunwired

+0

Chociaż to było dostępne tylko dla folderu z rysunkami. Dzięki za wskazówkę. –

2

Plik dimens.xml służy do przechowywania wszystkich zakodowanych wartości pikseli w jednym miejscu.

Teraz, mimo że obecnie nie można wielokrotnie używać tych wartości, dobrym pomysłem jest umieszczenie ich w wersji dimens.xml w celu późniejszego wykorzystania. Poza tym, stosowanie standardowego paradygmatu programowania Android pomaga innym programistom szybciej zrozumieć Twój kod. Jest to podobne do strings.xml, gdzie umieszczamy niektóre z nich, które są używane tylko raz! :)

+2

To nie jest to samo, pliki XML ciągów umożliwiają również internacjonalizację, więc lepiej mieć oddzielenie od kodu. –

+1

Co to za komentarz? –

+0

Przepraszam, jeśli nie wyraziłem się jasno. Chodzi mi o to, że twoje komentarze tak naprawdę nie pomogły w pytaniu Original Post, ani nie są całkowicie związane z moim postem. Po prostu jestem uczciwy! :) –

1

odpowiedź miejski

@Devunwired wymienia 3 powody, aby używać dimens.xml. Oto szczegóły, jak to zrobić.

1. Ponowne

Jeśli ustawisz jakiś dp lub sp wartość w dimens.xml raz jak ten

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

można używać go w całej aplikacji w wielu lokalizacjach.

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

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

Następnie, gdy trzeba dokonać zmiany, wystarczy zrobić to w jednym miejscu.

Uwagi

  • To jest w zasadzie taki sam efekt, jak przy użyciu stylu lub motywu.
  • Uważaj, aby nie podawać dwóch różnych widoków tej samej wartości dimen, jeśli naprawdę nie powinny być.Jeśli chcesz dokonać zmian w jednym zestawie widoków, ale nie w innym, będziesz musiał wrócić do każdego z osobna, co zniszczy cel.

2. Rozmiar Różnica

  • @Devunwired nazywa tę różnicę Density, ale jeśli używasz dp (gęstość niezależnych pikseli), to już trwa opieki są problemem różnicy gęstości dla wszystkich, ale najbardziej pomniejsze przypadki. Tak więc, moim zdaniem, rozmiar ekranu jest ważniejszym czynnikiem dla używania dimens.xml.

8dp wyściółka może wyglądać świetnie na telefon, ale gdy aplikacja zostanie uruchomiona na tablecie, wygląda zbyt wąskie. Możesz rozwiązać ten problem, tworząc dwie (lub więcej) różne wersje dimens.xml.

Kliknij prawym przyciskiem myszy folder res i wybierz opcję Nowy> Plik zasobów wartości. Następnie napisz w dimens i wybierz Najmniejsza szerokość ekranu. Napisz w dla szerokości (tablet 7 "). (Istnieją inne sposoby doboru rozmiarów. Zobacz documentation i this answer więcej.)

enter image description here

To uczyni kolejny values folder, który będzie używany do urządzeń, których szerokość jest najmniejszy ekran 600dp. W widoku systemu Android dwa pliki dimens.xml wyglądają tak:

enter image description here

Teraz można zmodyfikować je niezależnie.

wartości/dimens.xml

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

Wartości-sw600dp/dimens.xml

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

podczas korzystania z dimen trzeba tylko ustawić go z nazwą użytego w oba pliki dimens.xml.

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

</LinearLayout> 

System automatycznie wybierze odpowiednią wartość w zależności od urządzenia, z którego korzysta użytkownik.

3. Czytanie z kodem

Czasem jest to ból skalowania programowego między px i dp (patrz this answer dla how).

Jeśli masz stałe dp wartość już zdefiniowany w dimens.xml jak ten

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

Następnie można łatwo dostać go z

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

i będzie on już być konwertowane na piksele z jakiegokolwiek urządzenia gęstości użytkownik ma.

+0

jest to bardzo pomocne. czy znasz sposób na zmuszenie Androida Studio do wybrania konkretnego pliku dimens.xml do użycia podczas podglądu układu? Mam problem z konfiguracją pliku dla Samsung S7 landscape - Zrobiłem plik wartości sw640dp, ale podgląd wybiera domyślny. –

+0

@orionelenzil, nie wiem o podglądzie układu. Możesz spróbować zadać nowe pytanie na ten temat. Powiem, że 'sw600dp' jest bardziej standardowym ustawieniem niż' sw640dp'. Jest to najmniejsza szerokość, więc '600' będzie zawierało' 640' i dowolne inne większe rozmiary. Ponadto, dopóki otrzymujesz poprawne wymiary podczas uruchamiania aplikacji w emulatorze lub urządzeniu, nie sądzę, aby miało to naprawdę znaczenie, jeśli podgląd nie działa. – Suragch

+0

dzięki @Sagagch. Wysłałem nowe pytanie [tutaj] (https://stackoverflow.com/questions/49138505/android-difficulty-working-with-dimens-xml-files). –

Powiązane problemy