Załaduj wartość wymiaru z res / values/dimension.xml z kodu źródłowego

Chciałbym załadować wartość tak, jak jest. Mam dwa pliki dimension.xml, jeden w /res/values/dimension.xml, a drugi w /res/values-sw360dp/dimension.xml.

Z kodu źródłowego chciałbym zrobić coś takiego

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

To działa, ale wartość, którą otrzymuję, jest pomnożona przez współczynnik gęstości ekranu (1.5 Dla hdpi, 2.0 Dla xhdpi, itp.).

Próbowałem też zrobić

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

To działa w zasadzie, ale dostaję ciąg, który kończy się "dip"...

Author: Trilarion, 2012-06-20

7 answers

W moich dołkach.XML mam

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

In code If I do

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

To zwróci 72, który jako stan docs jest mnożony przez gęstość obecnego telefonu (48dp x 1.5 W moim przypadku)

Dokładnie tak jak w dokumentach:

Pobiera wymiar dla określonego identyfikatora zasobu. Konwersje jednostek są oparte na bieżącym DisplayMetrics związanych z zasobami.

Więc jeśli chcesz dokładną wartość dp tak jak w xml po prostu podziel ją z DisplayMetrics gęstość

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

Dp będzie teraz 48

 653
Author: AndroidGecko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-07 07:24:11

Klasa Resource posiada również metodę getDimensionPixelSize () , która myślę, że będzie pasować do Twoich potrzeb.

 20
Author: Ovidiu Latcu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-20 13:48:14
Context.getResources().getDimension(int id);
 17
Author: Jug6ernaut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-20 13:47:54

Dla tych, którzy po prostu potrzebują zaoszczędzić trochę int wartości w zasobach, możesz wykonać następujące czynności.

Liczby całkowite.xml

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

Kod

int defaultValue = getResources().getInteger(R.integer.default_value);
 9
Author: Suragch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-25 03:10:11

Możesz użyć getDimensionPixelOffset () zamiast getDimension, więc nie musisz rzucać do int.

int valueInPixels = getResources().getDimensionPixelOffset(R.dimen.test)
 5
Author: Jonny Right,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-02 11:52:01

Można również zapisać liczbę całkowitą w pliku xml..
Czy widzieliście [to] http://developer.android.com/guide/topics/resources/more-resources.html#Integer ? Użyj jako .

 context.getResources().getInteger(R.integer.height_pop);
 2
Author: AndroidLad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-07 05:23:28
    This works but the value I get is multiplied times the screen density factor
  (1.5 for hdpi, 2.0 for xhdpi, etc).

Myślę, że dobrze jest uzyskać wartość według rozdzielczości, ale jeśli nie chcesz tego zrobić, daj to w px.......

Density-independent pixel (dp)

Wirtualna Jednostka pikseli, której należy użyć przy definiowaniu układu UI, aby wyrazić wymiary lub położenie układu w sposób niezależny od gęstości. Piksel niezależny od gęstości jest równoważny jednemu fizycznemu pikselowi na ekranie o rozdzielczości 160 dpi, co jest podstawową gęstością przyjętą przez system dla ekranu o "średniej" gęstości. At runtime, the system transparentnie obsługuje dowolne skalowanie jednostek dp, w razie potrzeby 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. należy zawsze używać jednostek dp przy definiowaniu interfejsu użytkownika aplikacji, aby zapewnić prawidłowe wyświetlanie interfejsu użytkownika na ekranach o różnych gęstościach.

Myślę, że dobrze jest zmienić wartość według rozdzielczości, ale jeśli nie chcesz tego zrobić, daj to w px.......

Zobacz to link

Jak na to

Dp

Piksele niezależne od gęstości - abstrakcyjna Jednostka oparta na gęstość fizyczna ekranu. Jednostki te są w stosunku do ekranu 160 DPI (kropki na cal), na którym 1dp jest mniej więcej równa 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. stosunek dp do piksela zmieni się wraz z gęstością ekranu, ale niekoniecznie w bezpośredniej proporcji. Użycie jednostek dp (zamiast jednostek px) jest prostym rozwiązaniem pozwalającym na poprawną zmianę rozmiaru widoku w układzie dla różnych gęstości ekranu. Innymi słowy, zapewnia spójność rzeczywistych rozmiarów elementów interfejsu użytkownika w różnych urządzenia.

Px

Pixels-odpowiada rzeczywistym pikselom na ekranie. Ta jednostka miary nie jest zalecana, ponieważ rzeczywista reprezentacja może się różnić w zależności od urządzenia; każde urządzenie może mieć różną liczbę pikseli na cal i może mieć więcej lub mniej całkowitych pikseli dostępnych na ekranie.

 1
Author: Dheeresh Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-20 13:53:08